ixgbe: fix index overflow when resetting big Tx queues
[dpdk.git] / lib / librte_pmd_ixgbe / ixgbe_rxtx.c
1 /*-
2  *   BSD LICENSE
3  * 
4  *   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  * 
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  * 
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  * 
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #include <sys/queue.h>
35
36 #include <endian.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <errno.h>
41 #include <stdint.h>
42 #include <stdarg.h>
43 #include <unistd.h>
44 #include <inttypes.h>
45
46 #include <rte_byteorder.h>
47 #include <rte_common.h>
48 #include <rte_cycles.h>
49 #include <rte_log.h>
50 #include <rte_debug.h>
51 #include <rte_interrupts.h>
52 #include <rte_pci.h>
53 #include <rte_memory.h>
54 #include <rte_memzone.h>
55 #include <rte_launch.h>
56 #include <rte_tailq.h>
57 #include <rte_eal.h>
58 #include <rte_per_lcore.h>
59 #include <rte_lcore.h>
60 #include <rte_atomic.h>
61 #include <rte_branch_prediction.h>
62 #include <rte_ring.h>
63 #include <rte_mempool.h>
64 #include <rte_malloc.h>
65 #include <rte_mbuf.h>
66 #include <rte_ether.h>
67 #include <rte_ethdev.h>
68 #include <rte_prefetch.h>
69 #include <rte_udp.h>
70 #include <rte_tcp.h>
71 #include <rte_sctp.h>
72 #include <rte_string_fns.h>
73 #include <rte_errno.h>
74
75 #include "ixgbe_logs.h"
76 #include "ixgbe/ixgbe_api.h"
77 #include "ixgbe/ixgbe_vf.h"
78 #include "ixgbe_ethdev.h"
79 #include "ixgbe/ixgbe_dcb.h"
80
81
82 #define RTE_PMD_IXGBE_TX_MAX_BURST 32
83
84 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
85 #define RTE_PMD_IXGBE_RX_MAX_BURST 32
86 #endif
87
88 static inline struct rte_mbuf *
89 rte_rxmbuf_alloc(struct rte_mempool *mp)
90 {
91         struct rte_mbuf *m;
92
93         m = __rte_mbuf_raw_alloc(mp);
94         __rte_mbuf_sanity_check_raw(m, RTE_MBUF_PKT, 0);
95         return (m);
96 }
97
98 #define RTE_MBUF_DATA_DMA_ADDR(mb) \
99         (uint64_t) ((mb)->buf_physaddr + (uint64_t)((char *)((mb)->pkt.data) - \
100         (char *)(mb)->buf_addr))
101
102 #define RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mb) \
103         (uint64_t) ((mb)->buf_physaddr + RTE_PKTMBUF_HEADROOM)
104
105 /**
106  * Structure associated with each descriptor of the RX ring of a RX queue.
107  */
108 struct igb_rx_entry {
109         struct rte_mbuf *mbuf; /**< mbuf associated with RX descriptor. */
110 };
111
112 /**
113  * Structure associated with each descriptor of the TX ring of a TX queue.
114  */
115 struct igb_tx_entry {
116         struct rte_mbuf *mbuf; /**< mbuf associated with TX desc, if any. */
117         uint16_t next_id; /**< Index of next descriptor in ring. */
118         uint16_t last_id; /**< Index of last scattered descriptor. */
119 };
120
121 /**
122  * Structure associated with each RX queue.
123  */
124 struct igb_rx_queue {
125         struct rte_mempool  *mb_pool; /**< mbuf pool to populate RX ring. */
126         volatile union ixgbe_adv_rx_desc *rx_ring; /**< RX ring virtual address. */
127         uint64_t            rx_ring_phys_addr; /**< RX ring DMA address. */
128         volatile uint32_t   *rdt_reg_addr; /**< RDT register address. */
129         volatile uint32_t   *rdh_reg_addr; /**< RDH register address. */
130         struct igb_rx_entry *sw_ring; /**< address of RX software ring. */
131         struct rte_mbuf *pkt_first_seg; /**< First segment of current packet. */
132         struct rte_mbuf *pkt_last_seg; /**< Last segment of current packet. */
133         uint16_t            nb_rx_desc; /**< number of RX descriptors. */
134         uint16_t            rx_tail;  /**< current value of RDT register. */
135         uint16_t            nb_rx_hold; /**< number of held free RX desc. */
136 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
137         uint16_t rx_nb_avail; /**< nr of staged pkts ready to ret to app */
138         uint16_t rx_next_avail; /**< idx of next staged pkt to ret to app */
139         uint16_t rx_free_trigger; /**< triggers rx buffer allocation */
140 #endif
141         uint16_t            rx_free_thresh; /**< max free RX desc to hold. */
142         uint16_t            queue_id; /**< RX queue index. */
143         uint16_t            reg_idx;  /**< RX queue register index. */
144         uint8_t             port_id;  /**< Device port identifier. */
145         uint8_t             crc_len;  /**< 0 if CRC stripped, 4 otherwise. */
146         uint8_t             drop_en;  /**< If not 0, set SRRCTL.Drop_En. */
147 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
148         /** need to alloc dummy mbuf, for wraparound when scanning hw ring */
149         struct rte_mbuf fake_mbuf;
150         /** hold packets to return to application */
151         struct rte_mbuf *rx_stage[RTE_PMD_IXGBE_RX_MAX_BURST*2];
152 #endif
153 };
154
155 /**
156  * IXGBE CTX Constants
157  */
158 enum ixgbe_advctx_num {
159         IXGBE_CTX_0    = 0, /**< CTX0 */
160         IXGBE_CTX_1    = 1, /**< CTX1  */
161         IXGBE_CTX_NUM  = 2, /**< CTX NUMBER  */
162 };
163
164 /**
165  * Structure to check if new context need be built
166  */
167
168 struct ixgbe_advctx_info {
169         uint16_t flags;           /**< ol_flags for context build. */
170         uint32_t cmp_mask;        /**< compare mask for vlan_macip_lens */
171         union rte_vlan_macip vlan_macip_lens; /**< vlan, mac ip length. */
172 };
173
174 /**
175  * Structure associated with each TX queue.
176  */
177 struct igb_tx_queue {
178         /** TX ring virtual address. */
179         volatile union ixgbe_adv_tx_desc *tx_ring;
180         uint64_t            tx_ring_phys_addr; /**< TX ring DMA address. */
181         struct igb_tx_entry *sw_ring;      /**< virtual address of SW ring. */
182         volatile uint32_t   *tdt_reg_addr; /**< Address of TDT register. */
183         uint16_t            nb_tx_desc;    /**< number of TX descriptors. */
184         uint16_t            tx_tail;       /**< current value of TDT reg. */
185         uint16_t            tx_free_thresh;/**< minimum TX before freeing. */
186         /** Number of TX descriptors to use before RS bit is set. */
187         uint16_t            tx_rs_thresh;
188         /** Number of TX descriptors used since RS bit was set. */
189         uint16_t            nb_tx_used;
190         /** Index to last TX descriptor to have been cleaned. */
191         uint16_t            last_desc_cleaned;
192         /** Total number of TX descriptors ready to be allocated. */
193         uint16_t            nb_tx_free;
194         uint16_t tx_next_dd; /**< next desc to scan for DD bit */
195         uint16_t tx_next_rs; /**< next desc to set RS bit */
196         uint16_t            queue_id;      /**< TX queue index. */
197         uint16_t            reg_idx;       /**< TX queue register index. */
198         uint8_t             port_id;       /**< Device port identifier. */
199         uint8_t             pthresh;       /**< Prefetch threshold register. */
200         uint8_t             hthresh;       /**< Host threshold register. */
201         uint8_t             wthresh;       /**< Write-back threshold reg. */
202         uint32_t txq_flags; /**< Holds flags for this TXq */
203         uint32_t            ctx_curr;      /**< Hardware context states. */
204         /** Hardware context0 history. */
205         struct ixgbe_advctx_info ctx_cache[IXGBE_CTX_NUM];
206 };
207
208
209 #if 1
210 #define RTE_PMD_USE_PREFETCH
211 #endif
212
213 #ifdef RTE_PMD_USE_PREFETCH
214 /*
215  * Prefetch a cache line into all cache levels.
216  */
217 #define rte_ixgbe_prefetch(p)   rte_prefetch0(p)
218 #else
219 #define rte_ixgbe_prefetch(p)   do {} while(0)
220 #endif
221
222 #ifdef RTE_PMD_PACKET_PREFETCH
223 #define rte_packet_prefetch(p)  rte_prefetch1(p)
224 #else
225 #define rte_packet_prefetch(p)  do {} while(0)
226 #endif
227
228 /*********************************************************************
229  *
230  *  TX functions
231  *
232  **********************************************************************/
233
234 /*
235  * The "simple" TX queue functions require that the following
236  * flags are set when the TX queue is configured:
237  *  - ETH_TXQ_FLAGS_NOMULTSEGS
238  *  - ETH_TXQ_FLAGS_NOVLANOFFL
239  *  - ETH_TXQ_FLAGS_NOXSUMSCTP
240  *  - ETH_TXQ_FLAGS_NOXSUMUDP
241  *  - ETH_TXQ_FLAGS_NOXSUMTCP
242  * and that the RS bit threshold (tx_rs_thresh) is at least equal to
243  * RTE_PMD_IXGBE_TX_MAX_BURST.
244  */
245 #define IXGBE_SIMPLE_FLAGS ((uint32_t)ETH_TXQ_FLAGS_NOMULTSEGS | \
246                             ETH_TXQ_FLAGS_NOOFFLOADS)
247
248 /*
249  * Check for descriptors with their DD bit set and free mbufs.
250  * Return the total number of buffers freed.
251  */
252 static inline int __attribute__((always_inline))
253 ixgbe_tx_free_bufs(struct igb_tx_queue *txq)
254 {
255         struct igb_tx_entry *txep;
256         uint32_t status;
257         int i;
258
259         /* check DD bit on threshold descriptor */
260         status = txq->tx_ring[txq->tx_next_dd].wb.status;
261         if (! (status & IXGBE_ADVTXD_STAT_DD))
262                 return 0;
263
264         /*
265          * first buffer to free from S/W ring is at index
266          * tx_next_dd - (tx_rs_thresh-1)
267          */
268         txep = &(txq->sw_ring[txq->tx_next_dd - (txq->tx_rs_thresh - 1)]);
269
270         /* prefetch the mbufs that are about to be freed */
271         for (i = 0; i < txq->tx_rs_thresh; ++i)
272                 rte_prefetch0((txep + i)->mbuf);
273
274         /* free buffers one at a time */
275         if ((txq->txq_flags & (uint32_t)ETH_TXQ_FLAGS_NOREFCOUNT) != 0) {
276                 for (i = 0; i < txq->tx_rs_thresh; ++i, ++txep) {
277                         rte_mempool_put(txep->mbuf->pool, txep->mbuf);
278                         txep->mbuf = NULL;
279                 }
280         } else {
281                 for (i = 0; i < txq->tx_rs_thresh; ++i, ++txep) {
282                         rte_pktmbuf_free_seg(txep->mbuf);
283                         txep->mbuf = NULL;
284                 }
285         }
286
287         /* buffers were freed, update counters */
288         txq->nb_tx_free = (uint16_t)(txq->nb_tx_free + txq->tx_rs_thresh);
289         txq->tx_next_dd = (uint16_t)(txq->tx_next_dd + txq->tx_rs_thresh);
290         if (txq->tx_next_dd >= txq->nb_tx_desc)
291                 txq->tx_next_dd = (uint16_t)(txq->tx_rs_thresh - 1);
292
293         return txq->tx_rs_thresh;
294 }
295
296 /*
297  * Populate descriptors with the following info:
298  * 1.) buffer_addr = phys_addr + headroom
299  * 2.) cmd_type_len = DCMD_DTYP_FLAGS | pkt_len
300  * 3.) olinfo_status = pkt_len << PAYLEN_SHIFT
301  */
302
303 /* Defines for Tx descriptor */
304 #define DCMD_DTYP_FLAGS (IXGBE_ADVTXD_DTYP_DATA |\
305                          IXGBE_ADVTXD_DCMD_IFCS |\
306                          IXGBE_ADVTXD_DCMD_DEXT |\
307                          IXGBE_ADVTXD_DCMD_EOP)
308
309 /* Populate 4 descriptors with data from 4 mbufs */
310 static inline void
311 tx4(volatile union ixgbe_adv_tx_desc *txdp, struct rte_mbuf **pkts)
312 {
313         uint64_t buf_dma_addr;
314         uint32_t pkt_len;
315         int i;
316
317         for (i = 0; i < 4; ++i, ++txdp, ++pkts) {
318                 buf_dma_addr = RTE_MBUF_DATA_DMA_ADDR(*pkts);
319                 pkt_len = (*pkts)->pkt.data_len;
320
321                 /* write data to descriptor */
322                 txdp->read.buffer_addr = buf_dma_addr;
323                 txdp->read.cmd_type_len =
324                                 ((uint32_t)DCMD_DTYP_FLAGS | pkt_len);
325                 txdp->read.olinfo_status =
326                                 (pkt_len << IXGBE_ADVTXD_PAYLEN_SHIFT);
327         }
328 }
329
330 /* Populate 1 descriptor with data from 1 mbuf */
331 static inline void
332 tx1(volatile union ixgbe_adv_tx_desc *txdp, struct rte_mbuf **pkts)
333 {
334         uint64_t buf_dma_addr;
335         uint32_t pkt_len;
336
337         buf_dma_addr = RTE_MBUF_DATA_DMA_ADDR(*pkts);
338         pkt_len = (*pkts)->pkt.data_len;
339
340         /* write data to descriptor */
341         txdp->read.buffer_addr = buf_dma_addr;
342         txdp->read.cmd_type_len =
343                         ((uint32_t)DCMD_DTYP_FLAGS | pkt_len);
344         txdp->read.olinfo_status =
345                         (pkt_len << IXGBE_ADVTXD_PAYLEN_SHIFT);
346 }
347
348 /*
349  * Fill H/W descriptor ring with mbuf data.
350  * Copy mbuf pointers to the S/W ring.
351  */
352 static inline void
353 ixgbe_tx_fill_hw_ring(struct igb_tx_queue *txq, struct rte_mbuf **pkts,
354                       uint16_t nb_pkts)
355 {
356         volatile union ixgbe_adv_tx_desc *txdp = &(txq->tx_ring[txq->tx_tail]);
357         struct igb_tx_entry *txep = &(txq->sw_ring[txq->tx_tail]);
358         const int N_PER_LOOP = 4;
359         const int N_PER_LOOP_MASK = N_PER_LOOP-1;
360         int mainpart, leftover;
361         int i, j;
362
363         /*
364          * Process most of the packets in chunks of N pkts.  Any
365          * leftover packets will get processed one at a time.
366          */
367         mainpart = (nb_pkts & ((uint32_t) ~N_PER_LOOP_MASK));
368         leftover = (nb_pkts & ((uint32_t)  N_PER_LOOP_MASK));
369         for (i = 0; i < mainpart; i += N_PER_LOOP) {
370                 /* Copy N mbuf pointers to the S/W ring */
371                 for (j = 0; j < N_PER_LOOP; ++j) {
372                         (txep + i + j)->mbuf = *(pkts + i + j);
373                 }
374                 tx4(txdp + i, pkts + i);
375         }
376
377         if (unlikely(leftover > 0)) {
378                 for (i = 0; i < leftover; ++i) {
379                         (txep + mainpart + i)->mbuf = *(pkts + mainpart + i);
380                         tx1(txdp + mainpart + i, pkts + mainpart + i);
381                 }
382         }
383 }
384
385 static inline uint16_t
386 tx_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
387              uint16_t nb_pkts)
388 {
389         struct igb_tx_queue *txq = (struct igb_tx_queue *)tx_queue;
390         volatile union ixgbe_adv_tx_desc *tx_r = txq->tx_ring;
391         uint16_t n = 0;
392
393         /*
394          * Begin scanning the H/W ring for done descriptors when the
395          * number of available descriptors drops below tx_free_thresh.  For
396          * each done descriptor, free the associated buffer.
397          */
398         if (txq->nb_tx_free < txq->tx_free_thresh)
399                 ixgbe_tx_free_bufs(txq);
400
401         /* Only use descriptors that are available */
402         nb_pkts = (uint16_t)RTE_MIN(txq->nb_tx_free, nb_pkts);
403         if (unlikely(nb_pkts == 0))
404                 return 0;
405
406         /* Use exactly nb_pkts descriptors */
407         txq->nb_tx_free = (uint16_t)(txq->nb_tx_free - nb_pkts);
408
409         /*
410          * At this point, we know there are enough descriptors in the
411          * ring to transmit all the packets.  This assumes that each
412          * mbuf contains a single segment, and that no new offloads
413          * are expected, which would require a new context descriptor.
414          */
415
416         /*
417          * See if we're going to wrap-around. If so, handle the top
418          * of the descriptor ring first, then do the bottom.  If not,
419          * the processing looks just like the "bottom" part anyway...
420          */
421         if ((txq->tx_tail + nb_pkts) > txq->nb_tx_desc) {
422                 n = (uint16_t)(txq->nb_tx_desc - txq->tx_tail);
423                 ixgbe_tx_fill_hw_ring(txq, tx_pkts, n);
424
425                 /*
426                  * We know that the last descriptor in the ring will need to
427                  * have its RS bit set because tx_rs_thresh has to be
428                  * a divisor of the ring size
429                  */
430                 tx_r[txq->tx_next_rs].read.cmd_type_len |=
431                         rte_cpu_to_le_32(IXGBE_ADVTXD_DCMD_RS);
432                 txq->tx_next_rs = (uint16_t)(txq->tx_rs_thresh - 1);
433
434                 txq->tx_tail = 0;
435         }
436
437         /* Fill H/W descriptor ring with mbuf data */
438         ixgbe_tx_fill_hw_ring(txq, tx_pkts + n, (uint16_t)(nb_pkts - n));
439         txq->tx_tail = (uint16_t)(txq->tx_tail + (nb_pkts - n));
440
441         /*
442          * Determine if RS bit should be set
443          * This is what we actually want:
444          *   if ((txq->tx_tail - 1) >= txq->tx_next_rs)
445          * but instead of subtracting 1 and doing >=, we can just do
446          * greater than without subtracting.
447          */
448         if (txq->tx_tail > txq->tx_next_rs) {
449                 tx_r[txq->tx_next_rs].read.cmd_type_len |=
450                         rte_cpu_to_le_32(IXGBE_ADVTXD_DCMD_RS);
451                 txq->tx_next_rs = (uint16_t)(txq->tx_next_rs +
452                                                 txq->tx_rs_thresh);
453                 if (txq->tx_next_rs >= txq->nb_tx_desc)
454                         txq->tx_next_rs = (uint16_t)(txq->tx_rs_thresh - 1);
455         }
456
457         /*
458          * Check for wrap-around. This would only happen if we used
459          * up to the last descriptor in the ring, no more, no less.
460          */
461         if (txq->tx_tail >= txq->nb_tx_desc)
462                 txq->tx_tail = 0;
463
464         /* update tail pointer */
465         rte_wmb();
466         IXGBE_PCI_REG_WRITE(txq->tdt_reg_addr, txq->tx_tail);
467
468         return nb_pkts;
469 }
470
471 uint16_t
472 ixgbe_xmit_pkts_simple(void *tx_queue, struct rte_mbuf **tx_pkts,
473                        uint16_t nb_pkts)
474 {
475         uint16_t nb_tx;
476
477         /* Try to transmit at least chunks of TX_MAX_BURST pkts */
478         if (likely(nb_pkts <= RTE_PMD_IXGBE_TX_MAX_BURST))
479                 return tx_xmit_pkts(tx_queue, tx_pkts, nb_pkts);
480
481         /* transmit more than the max burst, in chunks of TX_MAX_BURST */
482         nb_tx = 0;
483         while (nb_pkts) {
484                 uint16_t ret, n;
485                 n = (uint16_t)RTE_MIN(nb_pkts, RTE_PMD_IXGBE_TX_MAX_BURST);
486                 ret = tx_xmit_pkts(tx_queue, &(tx_pkts[nb_tx]), n);
487                 nb_tx = (uint16_t)(nb_tx + ret);
488                 nb_pkts = (uint16_t)(nb_pkts - ret);
489                 if (ret < n)
490                         break;
491         }
492
493         return nb_tx;
494 }
495
496 static inline void
497 ixgbe_set_xmit_ctx(struct igb_tx_queue* txq,
498                 volatile struct ixgbe_adv_tx_context_desc *ctx_txd,
499                 uint16_t ol_flags, uint32_t vlan_macip_lens)
500 {
501         uint32_t type_tucmd_mlhl;
502         uint32_t mss_l4len_idx;
503         uint32_t ctx_idx;
504         uint32_t cmp_mask;
505
506         ctx_idx = txq->ctx_curr;
507         cmp_mask = 0;
508         type_tucmd_mlhl = 0;
509
510         if (ol_flags & PKT_TX_VLAN_PKT) {
511                 cmp_mask |= TX_VLAN_CMP_MASK;
512         }
513
514         if (ol_flags & PKT_TX_IP_CKSUM) {
515                 type_tucmd_mlhl = IXGBE_ADVTXD_TUCMD_IPV4;
516                 cmp_mask |= TX_MAC_LEN_CMP_MASK;
517         }
518
519         /* Specify which HW CTX to upload. */
520         mss_l4len_idx = (ctx_idx << IXGBE_ADVTXD_IDX_SHIFT);
521         switch (ol_flags & PKT_TX_L4_MASK) {
522         case PKT_TX_UDP_CKSUM:
523                 type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_UDP |
524                                 IXGBE_ADVTXD_DTYP_CTXT | IXGBE_ADVTXD_DCMD_DEXT;
525                 mss_l4len_idx |= sizeof(struct udp_hdr) << IXGBE_ADVTXD_L4LEN_SHIFT;
526                 cmp_mask |= TX_MACIP_LEN_CMP_MASK;
527                 break;
528         case PKT_TX_TCP_CKSUM:
529                 type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP |
530                                 IXGBE_ADVTXD_DTYP_CTXT | IXGBE_ADVTXD_DCMD_DEXT;
531                 mss_l4len_idx |= sizeof(struct tcp_hdr) << IXGBE_ADVTXD_L4LEN_SHIFT;
532                 cmp_mask |= TX_MACIP_LEN_CMP_MASK;
533                 break;
534         case PKT_TX_SCTP_CKSUM:
535                 type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_SCTP |
536                                 IXGBE_ADVTXD_DTYP_CTXT | IXGBE_ADVTXD_DCMD_DEXT;
537                 mss_l4len_idx |= sizeof(struct sctp_hdr) << IXGBE_ADVTXD_L4LEN_SHIFT;
538                 cmp_mask |= TX_MACIP_LEN_CMP_MASK;
539                 break;
540         default:
541                 type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_RSV |
542                                 IXGBE_ADVTXD_DTYP_CTXT | IXGBE_ADVTXD_DCMD_DEXT;
543                 break;
544         }
545
546         txq->ctx_cache[ctx_idx].flags = ol_flags;
547         txq->ctx_cache[ctx_idx].cmp_mask = cmp_mask;
548         txq->ctx_cache[ctx_idx].vlan_macip_lens.data =
549                 vlan_macip_lens & cmp_mask;
550
551         ctx_txd->type_tucmd_mlhl = rte_cpu_to_le_32(type_tucmd_mlhl);
552         ctx_txd->vlan_macip_lens = rte_cpu_to_le_32(vlan_macip_lens);
553         ctx_txd->mss_l4len_idx   = rte_cpu_to_le_32(mss_l4len_idx);
554         ctx_txd->seqnum_seed     = 0;
555 }
556
557 /*
558  * Check which hardware context can be used. Use the existing match
559  * or create a new context descriptor.
560  */
561 static inline uint32_t
562 what_advctx_update(struct igb_tx_queue *txq, uint16_t flags,
563                 uint32_t vlan_macip_lens)
564 {
565         /* If match with the current used context */
566         if (likely((txq->ctx_cache[txq->ctx_curr].flags == flags) &&
567                 (txq->ctx_cache[txq->ctx_curr].vlan_macip_lens.data ==
568                 (txq->ctx_cache[txq->ctx_curr].cmp_mask & vlan_macip_lens)))) {
569                         return txq->ctx_curr;
570         }
571
572         /* What if match with the next context  */
573         txq->ctx_curr ^= 1;
574         if (likely((txq->ctx_cache[txq->ctx_curr].flags == flags) &&
575                 (txq->ctx_cache[txq->ctx_curr].vlan_macip_lens.data ==
576                 (txq->ctx_cache[txq->ctx_curr].cmp_mask & vlan_macip_lens)))) {
577                         return txq->ctx_curr;
578         }
579
580         /* Mismatch, use the previous context */
581         return (IXGBE_CTX_NUM);
582 }
583
584 static inline uint32_t
585 tx_desc_cksum_flags_to_olinfo(uint16_t ol_flags)
586 {
587         static const uint32_t l4_olinfo[2] = {0, IXGBE_ADVTXD_POPTS_TXSM};
588         static const uint32_t l3_olinfo[2] = {0, IXGBE_ADVTXD_POPTS_IXSM};
589         uint32_t tmp;
590
591         tmp  = l4_olinfo[(ol_flags & PKT_TX_L4_MASK)  != PKT_TX_L4_NO_CKSUM];
592         tmp |= l3_olinfo[(ol_flags & PKT_TX_IP_CKSUM) != 0];
593         return tmp;
594 }
595
596 static inline uint32_t
597 tx_desc_vlan_flags_to_cmdtype(uint16_t ol_flags)
598 {
599         static const uint32_t vlan_cmd[2] = {0, IXGBE_ADVTXD_DCMD_VLE};
600         return vlan_cmd[(ol_flags & PKT_TX_VLAN_PKT) != 0];
601 }
602
603 /* Default RS bit threshold values */
604 #ifndef DEFAULT_TX_RS_THRESH
605 #define DEFAULT_TX_RS_THRESH   32
606 #endif
607 #ifndef DEFAULT_TX_FREE_THRESH
608 #define DEFAULT_TX_FREE_THRESH 32
609 #endif
610
611 /* Reset transmit descriptors after they have been used */
612 static inline int
613 ixgbe_xmit_cleanup(struct igb_tx_queue *txq)
614 {
615         struct igb_tx_entry *sw_ring = txq->sw_ring;
616         volatile union ixgbe_adv_tx_desc *txr = txq->tx_ring;
617         uint16_t last_desc_cleaned = txq->last_desc_cleaned;
618         uint16_t nb_tx_desc = txq->nb_tx_desc;
619         uint16_t desc_to_clean_to;
620         uint16_t nb_tx_to_clean;
621
622         /* Determine the last descriptor needing to be cleaned */
623         desc_to_clean_to = (uint16_t)(last_desc_cleaned + txq->tx_rs_thresh);
624         if (desc_to_clean_to >= nb_tx_desc)
625                 desc_to_clean_to = (uint16_t)(desc_to_clean_to - nb_tx_desc);
626
627         /* Check to make sure the last descriptor to clean is done */
628         desc_to_clean_to = sw_ring[desc_to_clean_to].last_id;
629         if (! (txr[desc_to_clean_to].wb.status & IXGBE_TXD_STAT_DD))
630         {
631                 PMD_TX_FREE_LOG(DEBUG,
632                                 "TX descriptor %4u is not done"
633                                 "(port=%d queue=%d)",
634                                 desc_to_clean_to,
635                                 txq->port_id, txq->queue_id);
636                 /* Failed to clean any descriptors, better luck next time */
637                 return -(1);
638         }
639
640         /* Figure out how many descriptors will be cleaned */
641         if (last_desc_cleaned > desc_to_clean_to)
642                 nb_tx_to_clean = (uint16_t)((nb_tx_desc - last_desc_cleaned) +
643                                                         desc_to_clean_to);
644         else
645                 nb_tx_to_clean = (uint16_t)(desc_to_clean_to -
646                                                 last_desc_cleaned);
647
648         PMD_TX_FREE_LOG(DEBUG,
649                         "Cleaning %4u TX descriptors: %4u to %4u "
650                         "(port=%d queue=%d)",
651                         nb_tx_to_clean, last_desc_cleaned, desc_to_clean_to,
652                         txq->port_id, txq->queue_id);
653
654         /*
655          * The last descriptor to clean is done, so that means all the
656          * descriptors from the last descriptor that was cleaned
657          * up to the last descriptor with the RS bit set
658          * are done. Only reset the threshold descriptor.
659          */
660         txr[desc_to_clean_to].wb.status = 0;
661
662         /* Update the txq to reflect the last descriptor that was cleaned */
663         txq->last_desc_cleaned = desc_to_clean_to;
664         txq->nb_tx_free = (uint16_t)(txq->nb_tx_free + nb_tx_to_clean);
665
666         /* No Error */
667         return (0);
668 }
669
670 uint16_t
671 ixgbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
672                 uint16_t nb_pkts)
673 {
674         struct igb_tx_queue *txq;
675         struct igb_tx_entry *sw_ring;
676         struct igb_tx_entry *txe, *txn;
677         volatile union ixgbe_adv_tx_desc *txr;
678         volatile union ixgbe_adv_tx_desc *txd;
679         struct rte_mbuf     *tx_pkt;
680         struct rte_mbuf     *m_seg;
681         uint64_t buf_dma_addr;
682         uint32_t olinfo_status;
683         uint32_t cmd_type_len;
684         uint32_t pkt_len;
685         uint16_t slen;
686         uint16_t ol_flags;
687         uint16_t tx_id;
688         uint16_t tx_last;
689         uint16_t nb_tx;
690         uint16_t nb_used;
691         uint16_t tx_ol_req;
692         uint32_t vlan_macip_lens;
693         uint32_t ctx = 0;
694         uint32_t new_ctx;
695
696         txq = tx_queue;
697         sw_ring = txq->sw_ring;
698         txr     = txq->tx_ring;
699         tx_id   = txq->tx_tail;
700         txe = &sw_ring[tx_id];
701
702         /* Determine if the descriptor ring needs to be cleaned. */
703         if ((txq->nb_tx_desc - txq->nb_tx_free) > txq->tx_free_thresh) {
704                 ixgbe_xmit_cleanup(txq);
705         }
706
707         /* TX loop */
708         for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
709                 new_ctx = 0;
710                 tx_pkt = *tx_pkts++;
711                 pkt_len = tx_pkt->pkt.pkt_len;
712
713                 RTE_MBUF_PREFETCH_TO_FREE(txe->mbuf);
714
715                 /*
716                  * Determine how many (if any) context descriptors
717                  * are needed for offload functionality.
718                  */
719                 ol_flags = tx_pkt->ol_flags;
720                 vlan_macip_lens = tx_pkt->pkt.vlan_macip.data;
721
722                 /* If hardware offload required */
723                 tx_ol_req = (uint16_t)(ol_flags & PKT_TX_OFFLOAD_MASK);
724                 if (tx_ol_req) {
725                         /* If new context need be built or reuse the exist ctx. */
726                         ctx = what_advctx_update(txq, tx_ol_req,
727                                 vlan_macip_lens);
728                         /* Only allocate context descriptor if required*/
729                         new_ctx = (ctx == IXGBE_CTX_NUM);
730                         ctx = txq->ctx_curr;
731                 }
732
733                 /*
734                  * Keep track of how many descriptors are used this loop
735                  * This will always be the number of segments + the number of
736                  * Context descriptors required to transmit the packet
737                  */
738                 nb_used = (uint16_t)(tx_pkt->pkt.nb_segs + new_ctx);
739
740                 /*
741                  * The number of descriptors that must be allocated for a
742                  * packet is the number of segments of that packet, plus 1
743                  * Context Descriptor for the hardware offload, if any.
744                  * Determine the last TX descriptor to allocate in the TX ring
745                  * for the packet, starting from the current position (tx_id)
746                  * in the ring.
747                  */
748                 tx_last = (uint16_t) (tx_id + nb_used - 1);
749
750                 /* Circular ring */
751                 if (tx_last >= txq->nb_tx_desc)
752                         tx_last = (uint16_t) (tx_last - txq->nb_tx_desc);
753
754                 PMD_TX_LOG(DEBUG, "port_id=%u queue_id=%u pktlen=%u"
755                            " tx_first=%u tx_last=%u\n",
756                            (unsigned) txq->port_id,
757                            (unsigned) txq->queue_id,
758                            (unsigned) pkt_len,
759                            (unsigned) tx_id,
760                            (unsigned) tx_last);
761
762                 /*
763                  * Make sure there are enough TX descriptors available to
764                  * transmit the entire packet.
765                  * nb_used better be less than or equal to txq->tx_rs_thresh
766                  */
767                 if (nb_used > txq->nb_tx_free) {
768                         PMD_TX_FREE_LOG(DEBUG,
769                                         "Not enough free TX descriptors "
770                                         "nb_used=%4u nb_free=%4u "
771                                         "(port=%d queue=%d)",
772                                         nb_used, txq->nb_tx_free,
773                                         txq->port_id, txq->queue_id);
774
775                         if (ixgbe_xmit_cleanup(txq) != 0) {
776                                 /* Could not clean any descriptors */
777                                 if (nb_tx == 0)
778                                         return (0);
779                                 goto end_of_tx;
780                         }
781
782                         /* nb_used better be <= txq->tx_rs_thresh */
783                         if (unlikely(nb_used > txq->tx_rs_thresh)) {
784                                 PMD_TX_FREE_LOG(DEBUG,
785                                         "The number of descriptors needed to "
786                                         "transmit the packet exceeds the "
787                                         "RS bit threshold. This will impact "
788                                         "performance."
789                                         "nb_used=%4u nb_free=%4u "
790                                         "tx_rs_thresh=%4u. "
791                                         "(port=%d queue=%d)",
792                                         nb_used, txq->nb_tx_free,
793                                         txq->tx_rs_thresh,
794                                         txq->port_id, txq->queue_id);
795                                 /*
796                                  * Loop here until there are enough TX
797                                  * descriptors or until the ring cannot be
798                                  * cleaned.
799                                  */
800                                 while (nb_used > txq->nb_tx_free) {
801                                         if (ixgbe_xmit_cleanup(txq) != 0) {
802                                                 /*
803                                                  * Could not clean any
804                                                  * descriptors
805                                                  */
806                                                 if (nb_tx == 0)
807                                                         return (0);
808                                                 goto end_of_tx;
809                                         }
810                                 }
811                         }
812                 }
813
814                 /*
815                  * By now there are enough free TX descriptors to transmit
816                  * the packet.
817                  */
818
819                 /*
820                  * Set common flags of all TX Data Descriptors.
821                  *
822                  * The following bits must be set in all Data Descriptors:
823                  *   - IXGBE_ADVTXD_DTYP_DATA
824                  *   - IXGBE_ADVTXD_DCMD_DEXT
825                  *
826                  * The following bits must be set in the first Data Descriptor
827                  * and are ignored in the other ones:
828                  *   - IXGBE_ADVTXD_DCMD_IFCS
829                  *   - IXGBE_ADVTXD_MAC_1588
830                  *   - IXGBE_ADVTXD_DCMD_VLE
831                  *
832                  * The following bits must only be set in the last Data
833                  * Descriptor:
834                  *   - IXGBE_TXD_CMD_EOP
835                  *
836                  * The following bits can be set in any Data Descriptor, but
837                  * are only set in the last Data Descriptor:
838                  *   - IXGBE_TXD_CMD_RS
839                  */
840                 cmd_type_len = IXGBE_ADVTXD_DTYP_DATA |
841                         IXGBE_ADVTXD_DCMD_IFCS | IXGBE_ADVTXD_DCMD_DEXT;
842                 olinfo_status = (pkt_len << IXGBE_ADVTXD_PAYLEN_SHIFT);
843 #ifdef RTE_LIBRTE_IEEE1588
844                 if (ol_flags & PKT_TX_IEEE1588_TMST)
845                         cmd_type_len |= IXGBE_ADVTXD_MAC_1588;
846 #endif
847
848                 if (tx_ol_req) {
849                         /*
850                          * Setup the TX Advanced Context Descriptor if required
851                          */
852                         if (new_ctx) {
853                                 volatile struct ixgbe_adv_tx_context_desc *
854                                     ctx_txd;
855
856                                 ctx_txd = (volatile struct
857                                     ixgbe_adv_tx_context_desc *)
858                                     &txr[tx_id];
859
860                                 txn = &sw_ring[txe->next_id];
861                                 RTE_MBUF_PREFETCH_TO_FREE(txn->mbuf);
862
863                                 if (txe->mbuf != NULL) {
864                                         rte_pktmbuf_free_seg(txe->mbuf);
865                                         txe->mbuf = NULL;
866                                 }
867
868                                 ixgbe_set_xmit_ctx(txq, ctx_txd, tx_ol_req,
869                                     vlan_macip_lens);
870
871                                 txe->last_id = tx_last;
872                                 tx_id = txe->next_id;
873                                 txe = txn;
874                         }
875
876                         /*
877                          * Setup the TX Advanced Data Descriptor,
878                          * This path will go through
879                          * whatever new/reuse the context descriptor
880                          */
881                         cmd_type_len  |= tx_desc_vlan_flags_to_cmdtype(ol_flags);
882                         olinfo_status |= tx_desc_cksum_flags_to_olinfo(ol_flags);
883                         olinfo_status |= ctx << IXGBE_ADVTXD_IDX_SHIFT;
884                 }
885
886                 m_seg = tx_pkt;
887                 do {
888                         txd = &txr[tx_id];
889                         txn = &sw_ring[txe->next_id];
890
891                         if (txe->mbuf != NULL)
892                                 rte_pktmbuf_free_seg(txe->mbuf);
893                         txe->mbuf = m_seg;
894
895                         /*
896                          * Set up Transmit Data Descriptor.
897                          */
898                         slen = m_seg->pkt.data_len;
899                         buf_dma_addr = RTE_MBUF_DATA_DMA_ADDR(m_seg);
900                         txd->read.buffer_addr =
901                                 rte_cpu_to_le_64(buf_dma_addr);
902                         txd->read.cmd_type_len =
903                                 rte_cpu_to_le_32(cmd_type_len | slen);
904                         txd->read.olinfo_status =
905                                 rte_cpu_to_le_32(olinfo_status);
906                         txe->last_id = tx_last;
907                         tx_id = txe->next_id;
908                         txe = txn;
909                         m_seg = m_seg->pkt.next;
910                 } while (m_seg != NULL);
911
912                 /*
913                  * The last packet data descriptor needs End Of Packet (EOP)
914                  */
915                 cmd_type_len |= IXGBE_TXD_CMD_EOP;
916                 txq->nb_tx_used = (uint16_t)(txq->nb_tx_used + nb_used);
917                 txq->nb_tx_free = (uint16_t)(txq->nb_tx_free - nb_used);
918
919                 /* Set RS bit only on threshold packets' last descriptor */
920                 if (txq->nb_tx_used >= txq->tx_rs_thresh) {
921                         PMD_TX_FREE_LOG(DEBUG,
922                                         "Setting RS bit on TXD id="
923                                         "%4u (port=%d queue=%d)",
924                                         tx_last, txq->port_id, txq->queue_id);
925
926                         cmd_type_len |= IXGBE_TXD_CMD_RS;
927
928                         /* Update txq RS bit counters */
929                         txq->nb_tx_used = 0;
930                 }
931                 txd->read.cmd_type_len |= rte_cpu_to_le_32(cmd_type_len);
932         }
933 end_of_tx:
934         rte_wmb();
935
936         /*
937          * Set the Transmit Descriptor Tail (TDT)
938          */
939         PMD_TX_LOG(DEBUG, "port_id=%u queue_id=%u tx_tail=%u nb_tx=%u",
940                    (unsigned) txq->port_id, (unsigned) txq->queue_id,
941                    (unsigned) tx_id, (unsigned) nb_tx);
942         IXGBE_PCI_REG_WRITE(txq->tdt_reg_addr, tx_id);
943         txq->tx_tail = tx_id;
944
945         return (nb_tx);
946 }
947
948 /*********************************************************************
949  *
950  *  RX functions
951  *
952  **********************************************************************/
953 static inline uint16_t
954 rx_desc_hlen_type_rss_to_pkt_flags(uint32_t hl_tp_rs)
955 {
956         uint16_t pkt_flags;
957
958         static uint16_t ip_pkt_types_map[16] = {
959                 0, PKT_RX_IPV4_HDR, PKT_RX_IPV4_HDR_EXT, PKT_RX_IPV4_HDR_EXT,
960                 PKT_RX_IPV6_HDR, 0, 0, 0,
961                 PKT_RX_IPV6_HDR_EXT, 0, 0, 0,
962                 PKT_RX_IPV6_HDR_EXT, 0, 0, 0,
963         };
964
965         static uint16_t ip_rss_types_map[16] = {
966                 0, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
967                 0, PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH,
968                 PKT_RX_RSS_HASH, 0, 0, 0,
969                 0, 0, 0,  PKT_RX_FDIR,
970         };
971
972 #ifdef RTE_LIBRTE_IEEE1588
973         static uint32_t ip_pkt_etqf_map[8] = {
974                 0, 0, 0, PKT_RX_IEEE1588_PTP,
975                 0, 0, 0, 0,
976         };
977
978         pkt_flags = (uint16_t) ((hl_tp_rs & IXGBE_RXDADV_PKTTYPE_ETQF) ?
979                                 ip_pkt_etqf_map[(hl_tp_rs >> 4) & 0x07] :
980                                 ip_pkt_types_map[(hl_tp_rs >> 4) & 0x0F]);
981 #else
982         pkt_flags = (uint16_t) ((hl_tp_rs & IXGBE_RXDADV_PKTTYPE_ETQF) ? 0 :
983                                 ip_pkt_types_map[(hl_tp_rs >> 4) & 0x0F]);
984
985 #endif
986         return (uint16_t)(pkt_flags | ip_rss_types_map[hl_tp_rs & 0xF]);
987 }
988
989 static inline uint16_t
990 rx_desc_status_to_pkt_flags(uint32_t rx_status)
991 {
992         uint16_t pkt_flags;
993
994         /*
995          * Check if VLAN present only.
996          * Do not check whether L3/L4 rx checksum done by NIC or not,
997          * That can be found from rte_eth_rxmode.hw_ip_checksum flag
998          */
999         pkt_flags = (uint16_t)((rx_status & IXGBE_RXD_STAT_VP) ?
1000                                                 PKT_RX_VLAN_PKT : 0);
1001
1002 #ifdef RTE_LIBRTE_IEEE1588
1003         if (rx_status & IXGBE_RXD_STAT_TMST)
1004                 pkt_flags = (uint16_t)(pkt_flags | PKT_RX_IEEE1588_TMST);
1005 #endif
1006         return pkt_flags;
1007 }
1008
1009 static inline uint16_t
1010 rx_desc_error_to_pkt_flags(uint32_t rx_status)
1011 {
1012         /*
1013          * Bit 31: IPE, IPv4 checksum error
1014          * Bit 30: L4I, L4I integrity error
1015          */
1016         static uint16_t error_to_pkt_flags_map[4] = {
1017                 0,  PKT_RX_L4_CKSUM_BAD, PKT_RX_IP_CKSUM_BAD,
1018                 PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD
1019         };
1020         return error_to_pkt_flags_map[(rx_status >>
1021                 IXGBE_RXDADV_ERR_CKSUM_BIT) & IXGBE_RXDADV_ERR_CKSUM_MSK];
1022 }
1023
1024 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
1025 /*
1026  * LOOK_AHEAD defines how many desc statuses to check beyond the
1027  * current descriptor. 
1028  * It must be a pound define for optimal performance.
1029  * Do not change the value of LOOK_AHEAD, as the ixgbe_rx_scan_hw_ring
1030  * function only works with LOOK_AHEAD=8.
1031  */
1032 #define LOOK_AHEAD 8
1033 #if (LOOK_AHEAD != 8)
1034 #error "PMD IXGBE: LOOK_AHEAD must be 8\n"
1035 #endif
1036 static inline int
1037 ixgbe_rx_scan_hw_ring(struct igb_rx_queue *rxq)
1038 {
1039         volatile union ixgbe_adv_rx_desc *rxdp;
1040         struct igb_rx_entry *rxep;
1041         struct rte_mbuf *mb;
1042         uint16_t pkt_len;
1043         int s[LOOK_AHEAD], nb_dd;
1044         int i, j, nb_rx = 0;
1045
1046
1047         /* get references to current descriptor and S/W ring entry */
1048         rxdp = &rxq->rx_ring[rxq->rx_tail];
1049         rxep = &rxq->sw_ring[rxq->rx_tail];
1050
1051         /* check to make sure there is at least 1 packet to receive */
1052         if (! (rxdp->wb.upper.status_error & IXGBE_RXDADV_STAT_DD))
1053                 return 0;
1054
1055         /*
1056          * Scan LOOK_AHEAD descriptors at a time to determine which descriptors
1057          * reference packets that are ready to be received.
1058          */
1059         for (i = 0; i < RTE_PMD_IXGBE_RX_MAX_BURST;
1060              i += LOOK_AHEAD, rxdp += LOOK_AHEAD, rxep += LOOK_AHEAD)
1061         {
1062                 /* Read desc statuses backwards to avoid race condition */
1063                 for (j = LOOK_AHEAD-1; j >= 0; --j)
1064                         s[j] = rxdp[j].wb.upper.status_error;
1065
1066                 /* Clear everything but the status bits (LSB) */
1067                 for (j = 0; j < LOOK_AHEAD; ++j)
1068                         s[j] &= IXGBE_RXDADV_STAT_DD;
1069
1070                 /* Compute how many status bits were set */
1071                 nb_dd = s[0]+s[1]+s[2]+s[3]+s[4]+s[5]+s[6]+s[7];
1072                 nb_rx += nb_dd;
1073
1074                 /* Translate descriptor info to mbuf format */
1075                 for (j = 0; j < nb_dd; ++j) {
1076                         mb = rxep[j].mbuf;
1077                         pkt_len = (uint16_t)(rxdp[j].wb.upper.length -
1078                                                         rxq->crc_len);
1079                         mb->pkt.data_len = pkt_len;
1080                         mb->pkt.pkt_len = pkt_len;
1081                         mb->pkt.vlan_macip.f.vlan_tci = rxdp[j].wb.upper.vlan;
1082                         mb->pkt.hash.rss = rxdp[j].wb.lower.hi_dword.rss;
1083
1084                         /* convert descriptor fields to rte mbuf flags */
1085                         mb->ol_flags  = rx_desc_hlen_type_rss_to_pkt_flags(
1086                                         rxdp[j].wb.lower.lo_dword.data);
1087                         /* reuse status field from scan list */
1088                         mb->ol_flags = (uint16_t)(mb->ol_flags |
1089                                         rx_desc_status_to_pkt_flags(s[j]));
1090                         mb->ol_flags = (uint16_t)(mb->ol_flags |
1091                                         rx_desc_error_to_pkt_flags(s[j]));
1092                 }
1093
1094                 /* Move mbuf pointers from the S/W ring to the stage */
1095                 for (j = 0; j < LOOK_AHEAD; ++j) {
1096                         rxq->rx_stage[i + j] = rxep[j].mbuf;
1097                 }
1098
1099                 /* stop if all requested packets could not be received */
1100                 if (nb_dd != LOOK_AHEAD)
1101                         break;
1102         }
1103
1104         /* clear software ring entries so we can cleanup correctly */
1105         for (i = 0; i < nb_rx; ++i) {
1106                 rxq->sw_ring[rxq->rx_tail + i].mbuf = NULL;
1107         }
1108
1109
1110         return nb_rx;
1111 }
1112
1113 static inline int
1114 ixgbe_rx_alloc_bufs(struct igb_rx_queue *rxq)
1115 {
1116         volatile union ixgbe_adv_rx_desc *rxdp;
1117         struct igb_rx_entry *rxep;
1118         struct rte_mbuf *mb;
1119         uint16_t alloc_idx;
1120         uint64_t dma_addr;
1121         int diag, i;
1122
1123         /* allocate buffers in bulk directly into the S/W ring */
1124         alloc_idx = (uint16_t)(rxq->rx_free_trigger -
1125                                 (rxq->rx_free_thresh - 1));
1126         rxep = &rxq->sw_ring[alloc_idx];
1127         diag = rte_mempool_get_bulk(rxq->mb_pool, (void *)rxep,
1128                                     rxq->rx_free_thresh);
1129         if (unlikely(diag != 0))
1130                 return (-ENOMEM);
1131
1132         rxdp = &rxq->rx_ring[alloc_idx];
1133         for (i = 0; i < rxq->rx_free_thresh; ++i) {
1134                 /* populate the static rte mbuf fields */
1135                 mb = rxep[i].mbuf;
1136                 rte_mbuf_refcnt_set(mb, 1);
1137                 mb->type = RTE_MBUF_PKT;
1138                 mb->pkt.next = NULL;
1139                 mb->pkt.data = (char *)mb->buf_addr + RTE_PKTMBUF_HEADROOM;
1140                 mb->pkt.nb_segs = 1;
1141                 mb->pkt.in_port = rxq->port_id;
1142
1143                 /* populate the descriptors */
1144                 dma_addr = (uint64_t)mb->buf_physaddr + RTE_PKTMBUF_HEADROOM;
1145                 rxdp[i].read.hdr_addr = dma_addr;
1146                 rxdp[i].read.pkt_addr = dma_addr;
1147         }
1148
1149         /* update tail pointer */
1150         rte_wmb();
1151         IXGBE_PCI_REG_WRITE(rxq->rdt_reg_addr, rxq->rx_free_trigger);
1152
1153         /* update state of internal queue structure */
1154         rxq->rx_free_trigger = (uint16_t)(rxq->rx_free_trigger +
1155                                                 rxq->rx_free_thresh);
1156         if (rxq->rx_free_trigger >= rxq->nb_rx_desc)
1157                 rxq->rx_free_trigger = (uint16_t)(rxq->rx_free_thresh - 1);
1158
1159         /* no errors */
1160         return 0;
1161 }
1162
1163 static inline uint16_t
1164 ixgbe_rx_fill_from_stage(struct igb_rx_queue *rxq, struct rte_mbuf **rx_pkts,
1165                          uint16_t nb_pkts)
1166 {
1167         struct rte_mbuf **stage = &rxq->rx_stage[rxq->rx_next_avail];
1168         int i;
1169
1170         /* how many packets are ready to return? */
1171         nb_pkts = (uint16_t)RTE_MIN(nb_pkts, rxq->rx_nb_avail);
1172
1173         /* copy mbuf pointers to the application's packet list */
1174         for (i = 0; i < nb_pkts; ++i)
1175                 rx_pkts[i] = stage[i];
1176
1177         /* update internal queue state */
1178         rxq->rx_nb_avail = (uint16_t)(rxq->rx_nb_avail - nb_pkts);
1179         rxq->rx_next_avail = (uint16_t)(rxq->rx_next_avail + nb_pkts);
1180
1181         return nb_pkts;
1182 }
1183
1184 static inline uint16_t
1185 rx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
1186              uint16_t nb_pkts)
1187 {
1188         struct igb_rx_queue *rxq = (struct igb_rx_queue *)rx_queue;
1189         uint16_t nb_rx = 0;
1190
1191         /* Any previously recv'd pkts will be returned from the Rx stage */
1192         if (rxq->rx_nb_avail)
1193                 return ixgbe_rx_fill_from_stage(rxq, rx_pkts, nb_pkts);
1194
1195         /* Scan the H/W ring for packets to receive */
1196         nb_rx = (uint16_t)ixgbe_rx_scan_hw_ring(rxq);
1197
1198         /* update internal queue state */
1199         rxq->rx_next_avail = 0;
1200         rxq->rx_nb_avail = nb_rx;
1201         rxq->rx_tail = (uint16_t)(rxq->rx_tail + nb_rx);
1202
1203         /* if required, allocate new buffers to replenish descriptors */
1204         if (rxq->rx_tail > rxq->rx_free_trigger) {
1205                 if (ixgbe_rx_alloc_bufs(rxq) != 0) {
1206                         int i, j;
1207                         PMD_RX_LOG(DEBUG, "RX mbuf alloc failed port_id=%u "
1208                                    "queue_id=%u\n", (unsigned) rxq->port_id,
1209                                    (unsigned) rxq->queue_id);
1210
1211                         rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed +=
1212                                 rxq->rx_free_thresh;
1213
1214                         /*
1215                          * Need to rewind any previous receives if we cannot
1216                          * allocate new buffers to replenish the old ones.
1217                          */
1218                         rxq->rx_nb_avail = 0;
1219                         rxq->rx_tail = (uint16_t)(rxq->rx_tail - nb_rx);
1220                         for (i = 0, j = rxq->rx_tail; i < nb_rx; ++i, ++j)
1221                                 rxq->sw_ring[j].mbuf = rxq->rx_stage[i];
1222
1223                         return 0;
1224                 }
1225         }
1226
1227         if (rxq->rx_tail >= rxq->nb_rx_desc)
1228                 rxq->rx_tail = 0;
1229
1230         /* received any packets this loop? */
1231         if (rxq->rx_nb_avail)
1232                 return ixgbe_rx_fill_from_stage(rxq, rx_pkts, nb_pkts);
1233
1234         return 0;
1235 }
1236
1237 /* split requests into chunks of size RTE_PMD_IXGBE_RX_MAX_BURST */
1238 uint16_t
1239 ixgbe_recv_pkts_bulk_alloc(void *rx_queue, struct rte_mbuf **rx_pkts,
1240                            uint16_t nb_pkts)
1241 {
1242         uint16_t nb_rx;
1243
1244         if (unlikely(nb_pkts == 0))
1245                 return 0;
1246
1247         if (likely(nb_pkts <= RTE_PMD_IXGBE_RX_MAX_BURST))
1248                 return rx_recv_pkts(rx_queue, rx_pkts, nb_pkts);
1249
1250         /* request is relatively large, chunk it up */
1251         nb_rx = 0;
1252         while (nb_pkts) {
1253                 uint16_t ret, n;
1254                 n = (uint16_t)RTE_MIN(nb_pkts, RTE_PMD_IXGBE_RX_MAX_BURST);
1255                 ret = rx_recv_pkts(rx_queue, &rx_pkts[nb_rx], n);
1256                 nb_rx = (uint16_t)(nb_rx + ret);
1257                 nb_pkts = (uint16_t)(nb_pkts - ret);
1258                 if (ret < n)
1259                         break;
1260         }
1261
1262         return nb_rx;
1263 }
1264 #endif /* RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC */
1265
1266 uint16_t
1267 ixgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
1268                 uint16_t nb_pkts)
1269 {
1270         struct igb_rx_queue *rxq;
1271         volatile union ixgbe_adv_rx_desc *rx_ring;
1272         volatile union ixgbe_adv_rx_desc *rxdp;
1273         struct igb_rx_entry *sw_ring;
1274         struct igb_rx_entry *rxe;
1275         struct rte_mbuf *rxm;
1276         struct rte_mbuf *nmb;
1277         union ixgbe_adv_rx_desc rxd;
1278         uint64_t dma_addr;
1279         uint32_t staterr;
1280         uint32_t hlen_type_rss;
1281         uint16_t pkt_len;
1282         uint16_t rx_id;
1283         uint16_t nb_rx;
1284         uint16_t nb_hold;
1285         uint16_t pkt_flags;
1286
1287         nb_rx = 0;
1288         nb_hold = 0;
1289         rxq = rx_queue;
1290         rx_id = rxq->rx_tail;
1291         rx_ring = rxq->rx_ring;
1292         sw_ring = rxq->sw_ring;
1293         while (nb_rx < nb_pkts) {
1294                 /*
1295                  * The order of operations here is important as the DD status
1296                  * bit must not be read after any other descriptor fields.
1297                  * rx_ring and rxdp are pointing to volatile data so the order
1298                  * of accesses cannot be reordered by the compiler. If they were
1299                  * not volatile, they could be reordered which could lead to
1300                  * using invalid descriptor fields when read from rxd.
1301                  */
1302                 rxdp = &rx_ring[rx_id];
1303                 staterr = rxdp->wb.upper.status_error;
1304                 if (! (staterr & rte_cpu_to_le_32(IXGBE_RXDADV_STAT_DD)))
1305                         break;
1306                 rxd = *rxdp;
1307
1308                 /*
1309                  * End of packet.
1310                  *
1311                  * If the IXGBE_RXDADV_STAT_EOP flag is not set, the RX packet
1312                  * is likely to be invalid and to be dropped by the various
1313                  * validation checks performed by the network stack.
1314                  *
1315                  * Allocate a new mbuf to replenish the RX ring descriptor.
1316                  * If the allocation fails:
1317                  *    - arrange for that RX descriptor to be the first one
1318                  *      being parsed the next time the receive function is
1319                  *      invoked [on the same queue].
1320                  *
1321                  *    - Stop parsing the RX ring and return immediately.
1322                  *
1323                  * This policy do not drop the packet received in the RX
1324                  * descriptor for which the allocation of a new mbuf failed.
1325                  * Thus, it allows that packet to be later retrieved if
1326                  * mbuf have been freed in the mean time.
1327                  * As a side effect, holding RX descriptors instead of
1328                  * systematically giving them back to the NIC may lead to
1329                  * RX ring exhaustion situations.
1330                  * However, the NIC can gracefully prevent such situations
1331                  * to happen by sending specific "back-pressure" flow control
1332                  * frames to its peer(s).
1333                  */
1334                 PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_id=%u "
1335                            "ext_err_stat=0x%08x pkt_len=%u\n",
1336                            (unsigned) rxq->port_id, (unsigned) rxq->queue_id,
1337                            (unsigned) rx_id, (unsigned) staterr,
1338                            (unsigned) rte_le_to_cpu_16(rxd.wb.upper.length));
1339
1340                 nmb = rte_rxmbuf_alloc(rxq->mb_pool);
1341                 if (nmb == NULL) {
1342                         PMD_RX_LOG(DEBUG, "RX mbuf alloc failed port_id=%u "
1343                                    "queue_id=%u\n", (unsigned) rxq->port_id,
1344                                    (unsigned) rxq->queue_id);
1345                         rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++;
1346                         break;
1347                 }
1348
1349                 nb_hold++;
1350                 rxe = &sw_ring[rx_id];
1351                 rx_id++;
1352                 if (rx_id == rxq->nb_rx_desc)
1353                         rx_id = 0;
1354
1355                 /* Prefetch next mbuf while processing current one. */
1356                 rte_ixgbe_prefetch(sw_ring[rx_id].mbuf);
1357
1358                 /*
1359                  * When next RX descriptor is on a cache-line boundary,
1360                  * prefetch the next 4 RX descriptors and the next 8 pointers
1361                  * to mbufs.
1362                  */
1363                 if ((rx_id & 0x3) == 0) {
1364                         rte_ixgbe_prefetch(&rx_ring[rx_id]);
1365                         rte_ixgbe_prefetch(&sw_ring[rx_id]);
1366                 }
1367
1368                 rxm = rxe->mbuf;
1369                 rxe->mbuf = nmb;
1370                 dma_addr =
1371                         rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(nmb));
1372                 rxdp->read.hdr_addr = dma_addr;
1373                 rxdp->read.pkt_addr = dma_addr;
1374
1375                 /*
1376                  * Initialize the returned mbuf.
1377                  * 1) setup generic mbuf fields:
1378                  *    - number of segments,
1379                  *    - next segment,
1380                  *    - packet length,
1381                  *    - RX port identifier.
1382                  * 2) integrate hardware offload data, if any:
1383                  *    - RSS flag & hash,
1384                  *    - IP checksum flag,
1385                  *    - VLAN TCI, if any,
1386                  *    - error flags.
1387                  */
1388                 pkt_len = (uint16_t) (rte_le_to_cpu_16(rxd.wb.upper.length) -
1389                                       rxq->crc_len);
1390                 rxm->pkt.data = (char*) rxm->buf_addr + RTE_PKTMBUF_HEADROOM;
1391                 rte_packet_prefetch(rxm->pkt.data);
1392                 rxm->pkt.nb_segs = 1;
1393                 rxm->pkt.next = NULL;
1394                 rxm->pkt.pkt_len = pkt_len;
1395                 rxm->pkt.data_len = pkt_len;
1396                 rxm->pkt.in_port = rxq->port_id;
1397
1398                 hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data);
1399                 /* Only valid if PKT_RX_VLAN_PKT set in pkt_flags */
1400                 rxm->pkt.vlan_macip.f.vlan_tci =
1401                         rte_le_to_cpu_16(rxd.wb.upper.vlan);
1402
1403                 pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss);
1404                 pkt_flags = (uint16_t)(pkt_flags |
1405                                 rx_desc_status_to_pkt_flags(staterr));
1406                 pkt_flags = (uint16_t)(pkt_flags |
1407                                 rx_desc_error_to_pkt_flags(staterr));
1408                 rxm->ol_flags = pkt_flags;
1409
1410                 if (likely(pkt_flags & PKT_RX_RSS_HASH))
1411                         rxm->pkt.hash.rss = rxd.wb.lower.hi_dword.rss;
1412                 else if (pkt_flags & PKT_RX_FDIR) {
1413                         rxm->pkt.hash.fdir.hash =
1414                                 (uint16_t)((rxd.wb.lower.hi_dword.csum_ip.csum)
1415                                            & IXGBE_ATR_HASH_MASK);
1416                         rxm->pkt.hash.fdir.id = rxd.wb.lower.hi_dword.csum_ip.ip_id;
1417                 }
1418                 /*
1419                  * Store the mbuf address into the next entry of the array
1420                  * of returned packets.
1421                  */
1422                 rx_pkts[nb_rx++] = rxm;
1423         }
1424         rxq->rx_tail = rx_id;
1425
1426         /*
1427          * If the number of free RX descriptors is greater than the RX free
1428          * threshold of the queue, advance the Receive Descriptor Tail (RDT)
1429          * register.
1430          * Update the RDT with the value of the last processed RX descriptor
1431          * minus 1, to guarantee that the RDT register is never equal to the
1432          * RDH register, which creates a "full" ring situtation from the
1433          * hardware point of view...
1434          */
1435         nb_hold = (uint16_t) (nb_hold + rxq->nb_rx_hold);
1436         if (nb_hold > rxq->rx_free_thresh) {
1437                 PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_tail=%u "
1438                            "nb_hold=%u nb_rx=%u\n",
1439                            (unsigned) rxq->port_id, (unsigned) rxq->queue_id,
1440                            (unsigned) rx_id, (unsigned) nb_hold,
1441                            (unsigned) nb_rx);
1442                 rx_id = (uint16_t) ((rx_id == 0) ?
1443                                      (rxq->nb_rx_desc - 1) : (rx_id - 1));
1444                 IXGBE_PCI_REG_WRITE(rxq->rdt_reg_addr, rx_id);
1445                 nb_hold = 0;
1446         }
1447         rxq->nb_rx_hold = nb_hold;
1448         return (nb_rx);
1449 }
1450
1451 uint16_t
1452 ixgbe_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
1453                           uint16_t nb_pkts)
1454 {
1455         struct igb_rx_queue *rxq;
1456         volatile union ixgbe_adv_rx_desc *rx_ring;
1457         volatile union ixgbe_adv_rx_desc *rxdp;
1458         struct igb_rx_entry *sw_ring;
1459         struct igb_rx_entry *rxe;
1460         struct rte_mbuf *first_seg;
1461         struct rte_mbuf *last_seg;
1462         struct rte_mbuf *rxm;
1463         struct rte_mbuf *nmb;
1464         union ixgbe_adv_rx_desc rxd;
1465         uint64_t dma; /* Physical address of mbuf data buffer */
1466         uint32_t staterr;
1467         uint32_t hlen_type_rss;
1468         uint16_t rx_id;
1469         uint16_t nb_rx;
1470         uint16_t nb_hold;
1471         uint16_t data_len;
1472         uint16_t pkt_flags;
1473
1474         nb_rx = 0;
1475         nb_hold = 0;
1476         rxq = rx_queue;
1477         rx_id = rxq->rx_tail;
1478         rx_ring = rxq->rx_ring;
1479         sw_ring = rxq->sw_ring;
1480
1481         /*
1482          * Retrieve RX context of current packet, if any.
1483          */
1484         first_seg = rxq->pkt_first_seg;
1485         last_seg = rxq->pkt_last_seg;
1486
1487         while (nb_rx < nb_pkts) {
1488         next_desc:
1489                 /*
1490                  * The order of operations here is important as the DD status
1491                  * bit must not be read after any other descriptor fields.
1492                  * rx_ring and rxdp are pointing to volatile data so the order
1493                  * of accesses cannot be reordered by the compiler. If they were
1494                  * not volatile, they could be reordered which could lead to
1495                  * using invalid descriptor fields when read from rxd.
1496                  */
1497                 rxdp = &rx_ring[rx_id];
1498                 staterr = rxdp->wb.upper.status_error;
1499                 if (! (staterr & rte_cpu_to_le_32(IXGBE_RXDADV_STAT_DD)))
1500                         break;
1501                 rxd = *rxdp;
1502
1503                 /*
1504                  * Descriptor done.
1505                  *
1506                  * Allocate a new mbuf to replenish the RX ring descriptor.
1507                  * If the allocation fails:
1508                  *    - arrange for that RX descriptor to be the first one
1509                  *      being parsed the next time the receive function is
1510                  *      invoked [on the same queue].
1511                  *
1512                  *    - Stop parsing the RX ring and return immediately.
1513                  *
1514                  * This policy does not drop the packet received in the RX
1515                  * descriptor for which the allocation of a new mbuf failed.
1516                  * Thus, it allows that packet to be later retrieved if
1517                  * mbuf have been freed in the mean time.
1518                  * As a side effect, holding RX descriptors instead of
1519                  * systematically giving them back to the NIC may lead to
1520                  * RX ring exhaustion situations.
1521                  * However, the NIC can gracefully prevent such situations
1522                  * to happen by sending specific "back-pressure" flow control
1523                  * frames to its peer(s).
1524                  */
1525                 PMD_RX_LOG(DEBUG, "\nport_id=%u queue_id=%u rx_id=%u "
1526                            "staterr=0x%x data_len=%u\n",
1527                            (unsigned) rxq->port_id, (unsigned) rxq->queue_id,
1528                            (unsigned) rx_id, (unsigned) staterr,
1529                            (unsigned) rte_le_to_cpu_16(rxd.wb.upper.length));
1530
1531                 nmb = rte_rxmbuf_alloc(rxq->mb_pool);
1532                 if (nmb == NULL) {
1533                         PMD_RX_LOG(DEBUG, "RX mbuf alloc failed port_id=%u "
1534                                    "queue_id=%u\n", (unsigned) rxq->port_id,
1535                                    (unsigned) rxq->queue_id);
1536                         rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++;
1537                         break;
1538                 }
1539
1540                 nb_hold++;
1541                 rxe = &sw_ring[rx_id];
1542                 rx_id++;
1543                 if (rx_id == rxq->nb_rx_desc)
1544                         rx_id = 0;
1545
1546                 /* Prefetch next mbuf while processing current one. */
1547                 rte_ixgbe_prefetch(sw_ring[rx_id].mbuf);
1548
1549                 /*
1550                  * When next RX descriptor is on a cache-line boundary,
1551                  * prefetch the next 4 RX descriptors and the next 8 pointers
1552                  * to mbufs.
1553                  */
1554                 if ((rx_id & 0x3) == 0) {
1555                         rte_ixgbe_prefetch(&rx_ring[rx_id]);
1556                         rte_ixgbe_prefetch(&sw_ring[rx_id]);
1557                 }
1558
1559                 /*
1560                  * Update RX descriptor with the physical address of the new
1561                  * data buffer of the new allocated mbuf.
1562                  */
1563                 rxm = rxe->mbuf;
1564                 rxe->mbuf = nmb;
1565                 dma = rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(nmb));
1566                 rxdp->read.hdr_addr = dma;
1567                 rxdp->read.pkt_addr = dma;
1568
1569                 /*
1570                  * Set data length & data buffer address of mbuf.
1571                  */
1572                 data_len = rte_le_to_cpu_16(rxd.wb.upper.length);
1573                 rxm->pkt.data_len = data_len;
1574                 rxm->pkt.data = (char*) rxm->buf_addr + RTE_PKTMBUF_HEADROOM;
1575
1576                 /*
1577                  * If this is the first buffer of the received packet,
1578                  * set the pointer to the first mbuf of the packet and
1579                  * initialize its context.
1580                  * Otherwise, update the total length and the number of segments
1581                  * of the current scattered packet, and update the pointer to
1582                  * the last mbuf of the current packet.
1583                  */
1584                 if (first_seg == NULL) {
1585                         first_seg = rxm;
1586                         first_seg->pkt.pkt_len = data_len;
1587                         first_seg->pkt.nb_segs = 1;
1588                 } else {
1589                         first_seg->pkt.pkt_len = (uint16_t)(first_seg->pkt.pkt_len
1590                                         + data_len);
1591                         first_seg->pkt.nb_segs++;
1592                         last_seg->pkt.next = rxm;
1593                 }
1594
1595                 /*
1596                  * If this is not the last buffer of the received packet,
1597                  * update the pointer to the last mbuf of the current scattered
1598                  * packet and continue to parse the RX ring.
1599                  */
1600                 if (! (staterr & IXGBE_RXDADV_STAT_EOP)) {
1601                         last_seg = rxm;
1602                         goto next_desc;
1603                 }
1604
1605                 /*
1606                  * This is the last buffer of the received packet.
1607                  * If the CRC is not stripped by the hardware:
1608                  *   - Subtract the CRC length from the total packet length.
1609                  *   - If the last buffer only contains the whole CRC or a part
1610                  *     of it, free the mbuf associated to the last buffer.
1611                  *     If part of the CRC is also contained in the previous
1612                  *     mbuf, subtract the length of that CRC part from the
1613                  *     data length of the previous mbuf.
1614                  */
1615                 rxm->pkt.next = NULL;
1616                 if (unlikely(rxq->crc_len > 0)) {
1617                         first_seg->pkt.pkt_len -= ETHER_CRC_LEN;
1618                         if (data_len <= ETHER_CRC_LEN) {
1619                                 rte_pktmbuf_free_seg(rxm);
1620                                 first_seg->pkt.nb_segs--;
1621                                 last_seg->pkt.data_len = (uint16_t)
1622                                         (last_seg->pkt.data_len -
1623                                          (ETHER_CRC_LEN - data_len));
1624                                 last_seg->pkt.next = NULL;
1625                         } else
1626                                 rxm->pkt.data_len =
1627                                         (uint16_t) (data_len - ETHER_CRC_LEN);
1628                 }
1629
1630                 /*
1631                  * Initialize the first mbuf of the returned packet:
1632                  *    - RX port identifier,
1633                  *    - hardware offload data, if any:
1634                  *      - RSS flag & hash,
1635                  *      - IP checksum flag,
1636                  *      - VLAN TCI, if any,
1637                  *      - error flags.
1638                  */
1639                 first_seg->pkt.in_port = rxq->port_id;
1640
1641                 /*
1642                  * The vlan_tci field is only valid when PKT_RX_VLAN_PKT is
1643                  * set in the pkt_flags field.
1644                  */
1645                 first_seg->pkt.vlan_macip.f.vlan_tci =
1646                                 rte_le_to_cpu_16(rxd.wb.upper.vlan);
1647                 hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data);
1648                 pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(hlen_type_rss);
1649                 pkt_flags = (uint16_t)(pkt_flags |
1650                                 rx_desc_status_to_pkt_flags(staterr));
1651                 pkt_flags = (uint16_t)(pkt_flags |
1652                                 rx_desc_error_to_pkt_flags(staterr));
1653                 first_seg->ol_flags = pkt_flags;
1654
1655                 if (likely(pkt_flags & PKT_RX_RSS_HASH))
1656                         first_seg->pkt.hash.rss = rxd.wb.lower.hi_dword.rss;
1657                 else if (pkt_flags & PKT_RX_FDIR) {
1658                         first_seg->pkt.hash.fdir.hash =
1659                                 (uint16_t)((rxd.wb.lower.hi_dword.csum_ip.csum)
1660                                            & IXGBE_ATR_HASH_MASK);
1661                         first_seg->pkt.hash.fdir.id =
1662                                 rxd.wb.lower.hi_dword.csum_ip.ip_id;
1663                 }
1664
1665                 /* Prefetch data of first segment, if configured to do so. */
1666                 rte_packet_prefetch(first_seg->pkt.data);
1667
1668                 /*
1669                  * Store the mbuf address into the next entry of the array
1670                  * of returned packets.
1671                  */
1672                 rx_pkts[nb_rx++] = first_seg;
1673
1674                 /*
1675                  * Setup receipt context for a new packet.
1676                  */
1677                 first_seg = NULL;
1678         }
1679
1680         /*
1681          * Record index of the next RX descriptor to probe.
1682          */
1683         rxq->rx_tail = rx_id;
1684
1685         /*
1686          * Save receive context.
1687          */
1688         rxq->pkt_first_seg = first_seg;
1689         rxq->pkt_last_seg = last_seg;
1690
1691         /*
1692          * If the number of free RX descriptors is greater than the RX free
1693          * threshold of the queue, advance the Receive Descriptor Tail (RDT)
1694          * register.
1695          * Update the RDT with the value of the last processed RX descriptor
1696          * minus 1, to guarantee that the RDT register is never equal to the
1697          * RDH register, which creates a "full" ring situtation from the
1698          * hardware point of view...
1699          */
1700         nb_hold = (uint16_t) (nb_hold + rxq->nb_rx_hold);
1701         if (nb_hold > rxq->rx_free_thresh) {
1702                 PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_tail=%u "
1703                            "nb_hold=%u nb_rx=%u\n",
1704                            (unsigned) rxq->port_id, (unsigned) rxq->queue_id,
1705                            (unsigned) rx_id, (unsigned) nb_hold,
1706                            (unsigned) nb_rx);
1707                 rx_id = (uint16_t) ((rx_id == 0) ?
1708                                      (rxq->nb_rx_desc - 1) : (rx_id - 1));
1709                 IXGBE_PCI_REG_WRITE(rxq->rdt_reg_addr, rx_id);
1710                 nb_hold = 0;
1711         }
1712         rxq->nb_rx_hold = nb_hold;
1713         return (nb_rx);
1714 }
1715
1716 /*********************************************************************
1717  *
1718  *  Queue management functions
1719  *
1720  **********************************************************************/
1721
1722 /*
1723  * Rings setup and release.
1724  *
1725  * TDBA/RDBA should be aligned on 16 byte boundary. But TDLEN/RDLEN should be
1726  * multiple of 128 bytes. So we align TDBA/RDBA on 128 byte boundary. This will
1727  * also optimize cache line size effect. H/W supports up to cache line size 128.
1728  */
1729 #define IXGBE_ALIGN 128
1730
1731 /*
1732  * Maximum number of Ring Descriptors.
1733  *
1734  * Since RDLEN/TDLEN should be multiple of 128 bytes, the number of ring
1735  * descriptors should meet the following condition:
1736  *      (num_ring_desc * sizeof(rx/tx descriptor)) % 128 == 0
1737  */
1738 #define IXGBE_MIN_RING_DESC 64
1739 #define IXGBE_MAX_RING_DESC 4096
1740
1741 /*
1742  * Create memzone for HW rings. malloc can't be used as the physical address is
1743  * needed. If the memzone is already created, then this function returns a ptr
1744  * to the old one.
1745  */
1746 static const struct rte_memzone *
1747 ring_dma_zone_reserve(struct rte_eth_dev *dev, const char *ring_name,
1748                       uint16_t queue_id, uint32_t ring_size, int socket_id)
1749 {
1750         char z_name[RTE_MEMZONE_NAMESIZE];
1751         const struct rte_memzone *mz;
1752
1753         rte_snprintf(z_name, sizeof(z_name), "%s_%s_%d_%d",
1754                         dev->driver->pci_drv.name, ring_name,
1755                         dev->data->port_id, queue_id);
1756
1757         mz = rte_memzone_lookup(z_name);
1758         if (mz)
1759                 return mz;
1760
1761         return rte_memzone_reserve_aligned(z_name, ring_size,
1762                         socket_id, 0, IXGBE_ALIGN);
1763 }
1764
1765 static void
1766 ixgbe_tx_queue_release_mbufs(struct igb_tx_queue *txq)
1767 {
1768         unsigned i;
1769
1770         if (txq->sw_ring != NULL) {
1771                 for (i = 0; i < txq->nb_tx_desc; i++) {
1772                         if (txq->sw_ring[i].mbuf != NULL) {
1773                                 rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
1774                                 txq->sw_ring[i].mbuf = NULL;
1775                         }
1776                 }
1777         }
1778 }
1779
1780 static void
1781 ixgbe_tx_queue_release(struct igb_tx_queue *txq)
1782 {
1783         if (txq != NULL) {
1784                 ixgbe_tx_queue_release_mbufs(txq);
1785                 rte_free(txq->sw_ring);
1786                 rte_free(txq);
1787         }
1788 }
1789
1790 void
1791 ixgbe_dev_tx_queue_release(void *txq)
1792 {
1793         ixgbe_tx_queue_release(txq);
1794 }
1795
1796 /* (Re)set dynamic igb_tx_queue fields to defaults */
1797 static void
1798 ixgbe_reset_tx_queue(struct igb_tx_queue *txq)
1799 {
1800         struct igb_tx_entry *txe = txq->sw_ring;
1801         uint16_t prev;
1802         uint32_t i;
1803
1804         /* Zero out HW ring memory */
1805         for (i = 0; i < sizeof(union ixgbe_adv_tx_desc) * txq->nb_tx_desc; i++) {
1806                 ((volatile char *)txq->tx_ring)[i] = 0;
1807         }
1808
1809         /* Initialize SW ring entries */
1810         prev = (uint16_t) (txq->nb_tx_desc - 1);
1811         for (i = 0; i < txq->nb_tx_desc; i++) {
1812                 volatile union ixgbe_adv_tx_desc *txd = &txq->tx_ring[i];
1813                 txd->wb.status = IXGBE_TXD_STAT_DD;
1814                 txe[i].mbuf = NULL;
1815                 txe[i].last_id = (uint16_t)i;
1816                 txe[prev].next_id = (uint16_t)i;
1817                 prev = (uint16_t)i;
1818         }
1819
1820         txq->tx_next_dd = (uint16_t)(txq->tx_rs_thresh - 1);
1821         txq->tx_next_rs = (uint16_t)(txq->tx_rs_thresh - 1);
1822
1823         txq->tx_tail = 0;
1824         txq->nb_tx_used = 0;
1825         /*
1826          * Always allow 1 descriptor to be un-allocated to avoid
1827          * a H/W race condition
1828          */
1829         txq->last_desc_cleaned = (uint16_t)(txq->nb_tx_desc - 1);
1830         txq->nb_tx_free = (uint16_t)(txq->nb_tx_desc - 1);
1831         txq->ctx_curr = 0;
1832         memset((void*)&txq->ctx_cache, 0,
1833                 IXGBE_CTX_NUM * sizeof(struct ixgbe_advctx_info));
1834 }
1835
1836 int
1837 ixgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
1838                          uint16_t queue_idx,
1839                          uint16_t nb_desc,
1840                          unsigned int socket_id,
1841                          const struct rte_eth_txconf *tx_conf)
1842 {
1843         const struct rte_memzone *tz;
1844         struct igb_tx_queue *txq;
1845         struct ixgbe_hw     *hw;
1846         uint16_t tx_rs_thresh, tx_free_thresh;
1847
1848         PMD_INIT_FUNC_TRACE();
1849         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1850
1851         /*
1852          * Validate number of transmit descriptors.
1853          * It must not exceed hardware maximum, and must be multiple
1854          * of IXGBE_ALIGN.
1855          */
1856         if (((nb_desc * sizeof(union ixgbe_adv_tx_desc)) % IXGBE_ALIGN) != 0 ||
1857             (nb_desc > IXGBE_MAX_RING_DESC) ||
1858             (nb_desc < IXGBE_MIN_RING_DESC)) {
1859                 return -EINVAL;
1860         }
1861
1862         /*
1863          * The following two parameters control the setting of the RS bit on
1864          * transmit descriptors.
1865          * TX descriptors will have their RS bit set after txq->tx_rs_thresh
1866          * descriptors have been used.
1867          * The TX descriptor ring will be cleaned after txq->tx_free_thresh
1868          * descriptors are used or if the number of descriptors required
1869          * to transmit a packet is greater than the number of free TX
1870          * descriptors.
1871          * The following constraints must be satisfied:
1872          *  tx_rs_thresh must be greater than 0.
1873          *  tx_rs_thresh must be less than the size of the ring minus 2.
1874          *  tx_rs_thresh must be less than or equal to tx_free_thresh.
1875          *  tx_rs_thresh must be a divisor of the ring size.
1876          *  tx_free_thresh must be greater than 0.
1877          *  tx_free_thresh must be less than the size of the ring minus 3.
1878          * One descriptor in the TX ring is used as a sentinel to avoid a
1879          * H/W race condition, hence the maximum threshold constraints.
1880          * When set to zero use default values.
1881          */
1882         tx_rs_thresh = (uint16_t)((tx_conf->tx_rs_thresh) ?
1883                         tx_conf->tx_rs_thresh : DEFAULT_TX_RS_THRESH);
1884         tx_free_thresh = (uint16_t)((tx_conf->tx_free_thresh) ?
1885                         tx_conf->tx_free_thresh : DEFAULT_TX_FREE_THRESH);
1886         if (tx_rs_thresh >= (nb_desc - 2)) {
1887                 RTE_LOG(ERR, PMD, "tx_rs_thresh must be less than the number "
1888                         "of TX descriptors minus 2. (tx_rs_thresh=%u port=%d "
1889                                 "queue=%d)\n", (unsigned int)tx_rs_thresh,
1890                                 (int)dev->data->port_id, (int)queue_idx);
1891                 return -(EINVAL);
1892         }
1893         if (tx_free_thresh >= (nb_desc - 3)) {
1894                 RTE_LOG(ERR, PMD, "tx_rs_thresh must be less than the "
1895                         "tx_free_thresh must be less than the number of TX "
1896                         "descriptors minus 3. (tx_free_thresh=%u port=%d "
1897                                 "queue=%d)\n", (unsigned int)tx_free_thresh,
1898                                 (int)dev->data->port_id, (int)queue_idx);
1899                 return -(EINVAL);
1900         }
1901         if (tx_rs_thresh > tx_free_thresh) {
1902                 RTE_LOG(ERR, PMD, "tx_rs_thresh must be less than or equal to "
1903                         "tx_free_thresh. (tx_free_thresh=%u tx_rs_thresh=%u "
1904                         "port=%d queue=%d)\n", (unsigned int)tx_free_thresh,
1905                         (unsigned int)tx_rs_thresh, (int)dev->data->port_id,
1906                                                         (int)queue_idx);
1907                 return -(EINVAL);
1908         }
1909         if ((nb_desc % tx_rs_thresh) != 0) {
1910                 RTE_LOG(ERR, PMD, "tx_rs_thresh must be a divisor of the "
1911                         "number of TX descriptors. (tx_rs_thresh=%u port=%d "
1912                                 "queue=%d)\n", (unsigned int)tx_rs_thresh,
1913                                 (int)dev->data->port_id, (int)queue_idx);
1914                 return -(EINVAL);
1915         }
1916
1917         /*
1918          * If rs_bit_thresh is greater than 1, then TX WTHRESH should be
1919          * set to 0. If WTHRESH is greater than zero, the RS bit is ignored
1920          * by the NIC and all descriptors are written back after the NIC
1921          * accumulates WTHRESH descriptors.
1922          */
1923         if ((tx_rs_thresh > 1) && (tx_conf->tx_thresh.wthresh != 0)) {
1924                 RTE_LOG(ERR, PMD, "TX WTHRESH must be set to 0 if "
1925                         "tx_rs_thresh is greater than 1. (tx_rs_thresh=%u "
1926                         "port=%d queue=%d)\n", (unsigned int)tx_rs_thresh,
1927                                 (int)dev->data->port_id, (int)queue_idx);
1928                 return -(EINVAL);
1929         }
1930
1931         /* Free memory prior to re-allocation if needed... */
1932         if (dev->data->tx_queues[queue_idx] != NULL)
1933                 ixgbe_tx_queue_release(dev->data->tx_queues[queue_idx]);
1934
1935         /* First allocate the tx queue data structure */
1936         txq = rte_zmalloc_socket("ethdev TX queue", sizeof(struct igb_tx_queue),
1937                                  CACHE_LINE_SIZE, socket_id);
1938         if (txq == NULL)
1939                 return (-ENOMEM);
1940
1941         /*
1942          * Allocate TX ring hardware descriptors. A memzone large enough to
1943          * handle the maximum ring size is allocated in order to allow for
1944          * resizing in later calls to the queue setup function.
1945          */
1946         tz = ring_dma_zone_reserve(dev, "tx_ring", queue_idx,
1947                         sizeof(union ixgbe_adv_tx_desc) * IXGBE_MAX_RING_DESC,
1948                         socket_id);
1949         if (tz == NULL) {
1950                 ixgbe_tx_queue_release(txq);
1951                 return (-ENOMEM);
1952         }
1953
1954         txq->nb_tx_desc = nb_desc;
1955         txq->tx_rs_thresh = tx_rs_thresh;
1956         txq->tx_free_thresh = tx_free_thresh;
1957         txq->pthresh = tx_conf->tx_thresh.pthresh;
1958         txq->hthresh = tx_conf->tx_thresh.hthresh;
1959         txq->wthresh = tx_conf->tx_thresh.wthresh;
1960         txq->queue_id = queue_idx;
1961         txq->reg_idx = (uint16_t)((RTE_ETH_DEV_SRIOV(dev).active == 0) ? 
1962                 queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx);
1963         txq->port_id = dev->data->port_id;
1964         txq->txq_flags = tx_conf->txq_flags;
1965
1966         /*
1967          * Modification to set VFTDT for virtual function if vf is detected
1968          */
1969         if (hw->mac.type == ixgbe_mac_82599_vf)
1970                 txq->tdt_reg_addr = IXGBE_PCI_REG_ADDR(hw, IXGBE_VFTDT(queue_idx));
1971         else
1972                 txq->tdt_reg_addr = IXGBE_PCI_REG_ADDR(hw, IXGBE_TDT(txq->reg_idx));
1973
1974         txq->tx_ring_phys_addr = (uint64_t) tz->phys_addr;
1975         txq->tx_ring = (union ixgbe_adv_tx_desc *) tz->addr;
1976
1977         /* Allocate software ring */
1978         txq->sw_ring = rte_zmalloc_socket("txq->sw_ring",
1979                                    sizeof(struct igb_tx_entry) * nb_desc,
1980                                    CACHE_LINE_SIZE, socket_id);
1981         if (txq->sw_ring == NULL) {
1982                 ixgbe_tx_queue_release(txq);
1983                 return (-ENOMEM);
1984         }
1985         PMD_INIT_LOG(DEBUG, "sw_ring=%p hw_ring=%p dma_addr=0x%"PRIx64"\n",
1986                      txq->sw_ring, txq->tx_ring, txq->tx_ring_phys_addr);
1987
1988         ixgbe_reset_tx_queue(txq);
1989
1990         dev->data->tx_queues[queue_idx] = txq;
1991
1992         /* Use a simple Tx queue (no offloads, no multi segs) if possible */
1993         if (((txq->txq_flags & IXGBE_SIMPLE_FLAGS) == IXGBE_SIMPLE_FLAGS) &&
1994             (txq->tx_rs_thresh >= RTE_PMD_IXGBE_TX_MAX_BURST)) {
1995                 PMD_INIT_LOG(INFO, "Using simple tx code path\n");
1996                 dev->tx_pkt_burst = ixgbe_xmit_pkts_simple;
1997         } else {
1998                 PMD_INIT_LOG(INFO, "Using full-featured tx code path\n");
1999                 PMD_INIT_LOG(INFO, " - txq_flags = %lx [IXGBE_SIMPLE_FLAGS=%lx]\n", (long unsigned)txq->txq_flags, (long unsigned)IXGBE_SIMPLE_FLAGS);
2000                 PMD_INIT_LOG(INFO, " - tx_rs_thresh = %lu [RTE_PMD_IXGBE_TX_MAX_BURST=%lu]\n", (long unsigned)txq->tx_rs_thresh, (long unsigned)RTE_PMD_IXGBE_TX_MAX_BURST);
2001                 dev->tx_pkt_burst = ixgbe_xmit_pkts;
2002         }
2003
2004         return (0);
2005 }
2006
2007 static void
2008 ixgbe_rx_queue_release_mbufs(struct igb_rx_queue *rxq)
2009 {
2010         unsigned i;
2011
2012         if (rxq->sw_ring != NULL) {
2013                 for (i = 0; i < rxq->nb_rx_desc; i++) {
2014                         if (rxq->sw_ring[i].mbuf != NULL) {
2015                                 rte_pktmbuf_free_seg(rxq->sw_ring[i].mbuf);
2016                                 rxq->sw_ring[i].mbuf = NULL;
2017                         }
2018                 }
2019 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2020                 if (rxq->rx_nb_avail) {
2021                         for (i = 0; i < rxq->rx_nb_avail; ++i) {
2022                                 struct rte_mbuf *mb;
2023                                 mb = rxq->rx_stage[rxq->rx_next_avail + i];
2024                                 rte_pktmbuf_free_seg(mb);
2025                         }
2026                         rxq->rx_nb_avail = 0;
2027                 }
2028 #endif
2029         }
2030 }
2031
2032 static void
2033 ixgbe_rx_queue_release(struct igb_rx_queue *rxq)
2034 {
2035         if (rxq != NULL) {
2036                 ixgbe_rx_queue_release_mbufs(rxq);
2037                 rte_free(rxq->sw_ring);
2038                 rte_free(rxq);
2039         }
2040 }
2041
2042 void
2043 ixgbe_dev_rx_queue_release(void *rxq)
2044 {
2045         ixgbe_rx_queue_release(rxq);
2046 }
2047
2048 /*
2049  * Check if Rx Burst Bulk Alloc function can be used.
2050  * Return
2051  *        0: the preconditions are satisfied and the bulk allocation function
2052  *           can be used.
2053  *  -EINVAL: the preconditions are NOT satisfied and the default Rx burst
2054  *           function must be used.
2055  */
2056 static inline int
2057 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2058 check_rx_burst_bulk_alloc_preconditions(struct igb_rx_queue *rxq)
2059 #else
2060 check_rx_burst_bulk_alloc_preconditions(__rte_unused struct igb_rx_queue *rxq)
2061 #endif
2062 {
2063         int ret = 0;
2064
2065         /*
2066          * Make sure the following pre-conditions are satisfied:
2067          *   rxq->rx_free_thresh >= RTE_PMD_IXGBE_RX_MAX_BURST
2068          *   rxq->rx_free_thresh < rxq->nb_rx_desc
2069          *   (rxq->nb_rx_desc % rxq->rx_free_thresh) == 0
2070          *   rxq->nb_rx_desc<(IXGBE_MAX_RING_DESC-RTE_PMD_IXGBE_RX_MAX_BURST)
2071          * Scattered packets are not supported.  This should be checked
2072          * outside of this function.
2073          */
2074 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2075         if (! (rxq->rx_free_thresh >= RTE_PMD_IXGBE_RX_MAX_BURST))
2076                 ret = -EINVAL;
2077         else if (! (rxq->rx_free_thresh < rxq->nb_rx_desc))
2078                 ret = -EINVAL;
2079         else if (! ((rxq->nb_rx_desc % rxq->rx_free_thresh) == 0))
2080                 ret = -EINVAL;
2081         else if (! (rxq->nb_rx_desc <
2082                (IXGBE_MAX_RING_DESC - RTE_PMD_IXGBE_RX_MAX_BURST)))
2083                 ret = -EINVAL;
2084 #else
2085         ret = -EINVAL;
2086 #endif
2087
2088         return ret;
2089 }
2090
2091 /* Reset dynamic igb_rx_queue fields back to defaults */
2092 static void
2093 ixgbe_reset_rx_queue(struct igb_rx_queue *rxq)
2094 {
2095         unsigned i;
2096         uint16_t len;
2097
2098         /*
2099          * By default, the Rx queue setup function allocates enough memory for
2100          * IXGBE_MAX_RING_DESC.  The Rx Burst bulk allocation function requires
2101          * extra memory at the end of the descriptor ring to be zero'd out. A
2102          * pre-condition for using the Rx burst bulk alloc function is that the
2103          * number of descriptors is less than or equal to
2104          * (IXGBE_MAX_RING_DESC - RTE_PMD_IXGBE_RX_MAX_BURST). Check all the
2105          * constraints here to see if we need to zero out memory after the end
2106          * of the H/W descriptor ring.
2107          */
2108 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2109         if (check_rx_burst_bulk_alloc_preconditions(rxq) == 0)
2110                 /* zero out extra memory */
2111                 len = (uint16_t)(rxq->nb_rx_desc + RTE_PMD_IXGBE_RX_MAX_BURST);
2112         else
2113 #endif
2114                 /* do not zero out extra memory */
2115                 len = rxq->nb_rx_desc;
2116
2117         /*
2118          * Zero out HW ring memory. Zero out extra memory at the end of
2119          * the H/W ring so look-ahead logic in Rx Burst bulk alloc function
2120          * reads extra memory as zeros.
2121          */
2122         for (i = 0; i < len * sizeof(union ixgbe_adv_rx_desc); i++) {
2123                 ((volatile char *)rxq->rx_ring)[i] = 0;
2124         }
2125
2126 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2127         /*
2128          * initialize extra software ring entries. Space for these extra
2129          * entries is always allocated
2130          */
2131         memset(&rxq->fake_mbuf, 0x0, sizeof(rxq->fake_mbuf));
2132         for (i = 0; i < RTE_PMD_IXGBE_RX_MAX_BURST; ++i) {
2133                 rxq->sw_ring[rxq->nb_rx_desc + i].mbuf = &rxq->fake_mbuf;
2134         }
2135
2136         rxq->rx_nb_avail = 0;
2137         rxq->rx_next_avail = 0;
2138         rxq->rx_free_trigger = (uint16_t)(rxq->rx_free_thresh - 1);
2139 #endif /* RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC */
2140         rxq->rx_tail = 0;
2141         rxq->nb_rx_hold = 0;
2142         rxq->pkt_first_seg = NULL;
2143         rxq->pkt_last_seg = NULL;
2144 }
2145
2146 int
2147 ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev,
2148                          uint16_t queue_idx,
2149                          uint16_t nb_desc,
2150                          unsigned int socket_id,
2151                          const struct rte_eth_rxconf *rx_conf,
2152                          struct rte_mempool *mp)
2153 {
2154         const struct rte_memzone *rz;
2155         struct igb_rx_queue *rxq;
2156         struct ixgbe_hw     *hw;
2157         int use_def_burst_func = 1;
2158         uint16_t len;
2159
2160         PMD_INIT_FUNC_TRACE();
2161         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2162
2163         /*
2164          * Validate number of receive descriptors.
2165          * It must not exceed hardware maximum, and must be multiple
2166          * of IXGBE_ALIGN.
2167          */
2168         if (((nb_desc * sizeof(union ixgbe_adv_rx_desc)) % IXGBE_ALIGN) != 0 ||
2169             (nb_desc > IXGBE_MAX_RING_DESC) ||
2170             (nb_desc < IXGBE_MIN_RING_DESC)) {
2171                 return (-EINVAL);
2172         }
2173
2174         /* Free memory prior to re-allocation if needed... */
2175         if (dev->data->rx_queues[queue_idx] != NULL)
2176                 ixgbe_rx_queue_release(dev->data->rx_queues[queue_idx]);
2177
2178         /* First allocate the rx queue data structure */
2179         rxq = rte_zmalloc_socket("ethdev RX queue", sizeof(struct igb_rx_queue),
2180                                  CACHE_LINE_SIZE, socket_id);
2181         if (rxq == NULL)
2182                 return (-ENOMEM);
2183         rxq->mb_pool = mp;
2184         rxq->nb_rx_desc = nb_desc;
2185         rxq->rx_free_thresh = rx_conf->rx_free_thresh;
2186         rxq->queue_id = queue_idx;
2187         rxq->reg_idx = (uint16_t)((RTE_ETH_DEV_SRIOV(dev).active == 0) ? 
2188                 queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx);
2189         rxq->port_id = dev->data->port_id;
2190         rxq->crc_len = (uint8_t) ((dev->data->dev_conf.rxmode.hw_strip_crc) ?
2191                                                         0 : ETHER_CRC_LEN);
2192         rxq->drop_en = rx_conf->rx_drop_en;
2193
2194         /*
2195          * Allocate RX ring hardware descriptors. A memzone large enough to
2196          * handle the maximum ring size is allocated in order to allow for
2197          * resizing in later calls to the queue setup function.
2198          */
2199         rz = ring_dma_zone_reserve(dev, "rx_ring", queue_idx,
2200                         IXGBE_MAX_RING_DESC * sizeof(union ixgbe_adv_rx_desc),
2201                         socket_id);
2202         if (rz == NULL) {
2203                 ixgbe_rx_queue_release(rxq);
2204                 return (-ENOMEM);
2205         }
2206         /*
2207          * Modified to setup VFRDT for Virtual Function
2208          */
2209         if (hw->mac.type == ixgbe_mac_82599_vf) {
2210                 rxq->rdt_reg_addr =
2211                         IXGBE_PCI_REG_ADDR(hw, IXGBE_VFRDT(queue_idx));
2212                 rxq->rdh_reg_addr =
2213                         IXGBE_PCI_REG_ADDR(hw, IXGBE_VFRDH(queue_idx));
2214         }
2215         else {
2216                 rxq->rdt_reg_addr =
2217                         IXGBE_PCI_REG_ADDR(hw, IXGBE_RDT(rxq->reg_idx));
2218                 rxq->rdh_reg_addr =
2219                         IXGBE_PCI_REG_ADDR(hw, IXGBE_RDH(rxq->reg_idx));
2220         }
2221
2222         rxq->rx_ring_phys_addr = (uint64_t) rz->phys_addr;
2223         rxq->rx_ring = (union ixgbe_adv_rx_desc *) rz->addr;
2224
2225         /*
2226          * Allocate software ring. Allow for space at the end of the 
2227          * S/W ring to make sure look-ahead logic in bulk alloc Rx burst
2228          * function does not access an invalid memory region.
2229          */
2230 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2231         len = (uint16_t)(nb_desc + RTE_PMD_IXGBE_RX_MAX_BURST);
2232 #else
2233         len = nb_desc;
2234 #endif
2235         rxq->sw_ring = rte_zmalloc_socket("rxq->sw_ring",
2236                                           sizeof(struct igb_rx_entry) * len,
2237                                           CACHE_LINE_SIZE, socket_id);
2238         if (rxq->sw_ring == NULL) {
2239                 ixgbe_rx_queue_release(rxq);
2240                 return (-ENOMEM);
2241         }
2242         PMD_INIT_LOG(DEBUG, "sw_ring=%p hw_ring=%p dma_addr=0x%"PRIx64"\n",
2243                      rxq->sw_ring, rxq->rx_ring, rxq->rx_ring_phys_addr);
2244
2245         /*
2246          * Certain constaints must be met in order to use the bulk buffer
2247          * allocation Rx burst function.
2248          */
2249         use_def_burst_func = check_rx_burst_bulk_alloc_preconditions(rxq);
2250
2251         /* Check if pre-conditions are satisfied, and no Scattered Rx */
2252         if (!use_def_burst_func && !dev->data->scattered_rx) {
2253 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2254                 PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions are "
2255                              "satisfied. Rx Burst Bulk Alloc function will be "
2256                              "used on port=%d, queue=%d.\n",
2257                              rxq->port_id, rxq->queue_id);
2258                 dev->rx_pkt_burst = ixgbe_recv_pkts_bulk_alloc;
2259 #endif
2260         } else {
2261                 PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions "
2262                              "are not satisfied, Scattered Rx is requested, "
2263                              "or RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC is not "
2264                              "enabled (port=%d, queue=%d).\n",
2265                              rxq->port_id, rxq->queue_id);
2266         }
2267         dev->data->rx_queues[queue_idx] = rxq;
2268
2269         ixgbe_reset_rx_queue(rxq);
2270
2271         return 0;
2272 }
2273
2274 uint32_t
2275 ixgbe_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
2276 {
2277 #define IXGBE_RXQ_SCAN_INTERVAL 4
2278         volatile union ixgbe_adv_rx_desc *rxdp;
2279         struct igb_rx_queue *rxq;
2280         uint32_t desc = 0;
2281
2282         if (rx_queue_id >= dev->data->nb_rx_queues) {
2283                 PMD_RX_LOG(ERR, "Invalid RX queue id=%d\n", rx_queue_id);
2284                 return 0;
2285         }
2286
2287         rxq = dev->data->rx_queues[rx_queue_id];
2288         rxdp = &(rxq->rx_ring[rxq->rx_tail]);
2289
2290         while ((desc < rxq->nb_rx_desc) &&
2291                 (rxdp->wb.upper.status_error & IXGBE_RXDADV_STAT_DD)) {
2292                 desc += IXGBE_RXQ_SCAN_INTERVAL;
2293                 rxdp += IXGBE_RXQ_SCAN_INTERVAL;
2294                 if (rxq->rx_tail + desc >= rxq->nb_rx_desc)
2295                         rxdp = &(rxq->rx_ring[rxq->rx_tail +
2296                                 desc - rxq->nb_rx_desc]);
2297         }
2298
2299         return desc;
2300 }
2301
2302 int
2303 ixgbe_dev_rx_descriptor_done(void *rx_queue, uint16_t offset)
2304 {
2305         volatile union ixgbe_adv_rx_desc *rxdp;
2306         struct igb_rx_queue *rxq = rx_queue;
2307         uint32_t desc;
2308
2309         if (unlikely(offset >= rxq->nb_rx_desc))
2310                 return 0;
2311         desc = rxq->rx_tail + offset;
2312         if (desc >= rxq->nb_rx_desc)
2313                 desc -= rxq->nb_rx_desc;
2314
2315         rxdp = &rxq->rx_ring[desc];
2316         return !!(rxdp->wb.upper.status_error & IXGBE_RXDADV_STAT_DD);
2317 }
2318
2319 void
2320 ixgbe_dev_clear_queues(struct rte_eth_dev *dev)
2321 {
2322         unsigned i;
2323
2324         PMD_INIT_FUNC_TRACE();
2325
2326         for (i = 0; i < dev->data->nb_tx_queues; i++) {
2327                 struct igb_tx_queue *txq = dev->data->tx_queues[i];
2328                 if (txq != NULL) {
2329                         ixgbe_tx_queue_release_mbufs(txq);
2330                         ixgbe_reset_tx_queue(txq);
2331                 }
2332         }
2333
2334         for (i = 0; i < dev->data->nb_rx_queues; i++) {
2335                 struct igb_rx_queue *rxq = dev->data->rx_queues[i];
2336                 if (rxq != NULL) {
2337                         ixgbe_rx_queue_release_mbufs(rxq);
2338                         ixgbe_reset_rx_queue(rxq);
2339                 }
2340         }
2341 }
2342
2343 /*********************************************************************
2344  *
2345  *  Device RX/TX init functions
2346  *
2347  **********************************************************************/
2348
2349 /**
2350  * Receive Side Scaling (RSS)
2351  * See section 7.1.2.8 in the following document:
2352  *     "Intel 82599 10 GbE Controller Datasheet" - Revision 2.1 October 2009
2353  *
2354  * Principles:
2355  * The source and destination IP addresses of the IP header and the source
2356  * and destination ports of TCP/UDP headers, if any, of received packets are
2357  * hashed against a configurable random key to compute a 32-bit RSS hash result.
2358  * The seven (7) LSBs of the 32-bit hash result are used as an index into a
2359  * 128-entry redirection table (RETA).  Each entry of the RETA provides a 3-bit
2360  * RSS output index which is used as the RX queue index where to store the
2361  * received packets.
2362  * The following output is supplied in the RX write-back descriptor:
2363  *     - 32-bit result of the Microsoft RSS hash function,
2364  *     - 4-bit RSS type field.
2365  */
2366
2367 /*
2368  * RSS random key supplied in section 7.1.2.8.3 of the Intel 82599 datasheet.
2369  * Used as the default key.
2370  */
2371 static uint8_t rss_intel_key[40] = {
2372         0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2,
2373         0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0,
2374         0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,
2375         0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C,
2376         0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA,
2377 };
2378
2379 static void
2380 ixgbe_rss_disable(struct rte_eth_dev *dev)
2381 {
2382         struct ixgbe_hw *hw;
2383         uint32_t mrqc;
2384
2385         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2386         mrqc = IXGBE_READ_REG(hw, IXGBE_MRQC);
2387         mrqc &= ~IXGBE_MRQC_RSSEN;
2388         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
2389 }
2390
2391 static void
2392 ixgbe_rss_configure(struct rte_eth_dev *dev)
2393 {
2394         struct ixgbe_hw *hw;
2395         uint8_t *hash_key;
2396         uint32_t rss_key;
2397         uint32_t mrqc;
2398         uint32_t reta;
2399         uint16_t rss_hf;
2400         uint16_t i;
2401         uint16_t j;
2402
2403         PMD_INIT_FUNC_TRACE();
2404         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2405
2406         rss_hf = dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf;
2407         if (rss_hf == 0) { /* Disable RSS */
2408                 ixgbe_rss_disable(dev);
2409                 return;
2410         }
2411         hash_key = dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key;
2412         if (hash_key == NULL)
2413                 hash_key = rss_intel_key; /* Default hash key */
2414
2415         /* Fill in RSS hash key */
2416         for (i = 0; i < 10; i++) {
2417                 rss_key  = hash_key[(i * 4)];
2418                 rss_key |= hash_key[(i * 4) + 1] << 8;
2419                 rss_key |= hash_key[(i * 4) + 2] << 16;
2420                 rss_key |= hash_key[(i * 4) + 3] << 24;
2421                 IXGBE_WRITE_REG_ARRAY(hw, IXGBE_RSSRK(0), i, rss_key);
2422         }
2423
2424         /* Fill in redirection table */
2425         reta = 0;
2426         for (i = 0, j = 0; i < 128; i++, j++) {
2427                 if (j == dev->data->nb_rx_queues) j = 0;
2428                 reta = (reta << 8) | j;
2429                 if ((i & 3) == 3)
2430                         IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), rte_bswap32(reta));
2431         }
2432
2433         /* Set configured hashing functions in MRQC register */
2434         mrqc = IXGBE_MRQC_RSSEN; /* RSS enable */
2435         if (rss_hf & ETH_RSS_IPV4)
2436                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
2437         if (rss_hf & ETH_RSS_IPV4_TCP)
2438                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
2439         if (rss_hf & ETH_RSS_IPV6)
2440                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
2441         if (rss_hf & ETH_RSS_IPV6_EX)
2442                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
2443         if (rss_hf & ETH_RSS_IPV6_TCP)
2444                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
2445         if (rss_hf & ETH_RSS_IPV6_TCP_EX)
2446                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
2447         if (rss_hf & ETH_RSS_IPV4_UDP)
2448                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
2449         if (rss_hf & ETH_RSS_IPV6_UDP)
2450                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
2451         if (rss_hf & ETH_RSS_IPV6_UDP_EX)
2452                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
2453         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
2454 }
2455
2456 #define NUM_VFTA_REGISTERS 128
2457 #define NIC_RX_BUFFER_SIZE 0x200
2458
2459 static void
2460 ixgbe_vmdq_dcb_configure(struct rte_eth_dev *dev)
2461 {
2462         struct rte_eth_vmdq_dcb_conf *cfg;
2463         struct ixgbe_hw *hw;
2464         enum rte_eth_nb_pools num_pools;
2465         uint32_t mrqc, vt_ctl, queue_mapping, vlanctrl;
2466         uint16_t pbsize;
2467         uint8_t nb_tcs; /* number of traffic classes */
2468         int i;
2469
2470         PMD_INIT_FUNC_TRACE();
2471         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2472         cfg = &dev->data->dev_conf.rx_adv_conf.vmdq_dcb_conf;
2473         num_pools = cfg->nb_queue_pools;
2474         /* Check we have a valid number of pools */
2475         if (num_pools != ETH_16_POOLS && num_pools != ETH_32_POOLS) {
2476                 ixgbe_rss_disable(dev);
2477                 return;
2478         }
2479         /* 16 pools -> 8 traffic classes, 32 pools -> 4 traffic classes */
2480         nb_tcs = (uint8_t)(ETH_VMDQ_DCB_NUM_QUEUES / (int)num_pools);
2481
2482         /*
2483          * RXPBSIZE
2484          * split rx buffer up into sections, each for 1 traffic class
2485          */
2486         pbsize = (uint16_t)(NIC_RX_BUFFER_SIZE / nb_tcs);
2487         for (i = 0 ; i < nb_tcs; i++) {
2488                 uint32_t rxpbsize = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i));
2489                 rxpbsize &= (~(0x3FF << IXGBE_RXPBSIZE_SHIFT));
2490                 /* clear 10 bits. */
2491                 rxpbsize |= (pbsize << IXGBE_RXPBSIZE_SHIFT); /* set value */
2492                 IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpbsize);
2493         }
2494         /* zero alloc all unused TCs */
2495         for (i = nb_tcs; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2496                 uint32_t rxpbsize = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i));
2497                 rxpbsize &= (~( 0x3FF << IXGBE_RXPBSIZE_SHIFT ));
2498                 /* clear 10 bits. */
2499                 IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpbsize);
2500         }
2501
2502         /* MRQC: enable vmdq and dcb */
2503         mrqc = ((num_pools == ETH_16_POOLS) ? \
2504                 IXGBE_MRQC_VMDQRT8TCEN : IXGBE_MRQC_VMDQRT4TCEN );
2505         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
2506
2507         /* PFVTCTL: turn on virtualisation and set the default pool */
2508         vt_ctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
2509         if (cfg->enable_default_pool) {
2510                 vt_ctl |= (cfg->default_pool << IXGBE_VT_CTL_POOL_SHIFT);
2511         } else {
2512                 vt_ctl |= IXGBE_VT_CTL_DIS_DEFPL;
2513         }
2514
2515         IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vt_ctl);
2516
2517         /* RTRUP2TC: mapping user priorities to traffic classes (TCs) */
2518         queue_mapping = 0;
2519         for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++)
2520                 /*
2521                  * mapping is done with 3 bits per priority,
2522                  * so shift by i*3 each time
2523                  */
2524                 queue_mapping |= ((cfg->dcb_queue[i] & 0x07) << (i * 3));
2525
2526         IXGBE_WRITE_REG(hw, IXGBE_RTRUP2TC, queue_mapping);
2527
2528         /* RTRPCS: DCB related */
2529         IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, IXGBE_RMCS_RRM);
2530
2531         /* VLNCTRL: enable vlan filtering and allow all vlan tags through */
2532         vlanctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
2533         vlanctrl |= IXGBE_VLNCTRL_VFE ; /* enable vlan filters */
2534         IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlanctrl);
2535
2536         /* VFTA - enable all vlan filters */
2537         for (i = 0; i < NUM_VFTA_REGISTERS; i++) {
2538                 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i), 0xFFFFFFFF);
2539         }
2540
2541         /* VFRE: pool enabling for receive - 16 or 32 */
2542         IXGBE_WRITE_REG(hw, IXGBE_VFRE(0), \
2543                         num_pools == ETH_16_POOLS ? 0xFFFF : 0xFFFFFFFF);
2544
2545         /*
2546          * MPSAR - allow pools to read specific mac addresses
2547          * In this case, all pools should be able to read from mac addr 0
2548          */
2549         IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(0), 0xFFFFFFFF);
2550         IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(0), 0xFFFFFFFF);
2551
2552         /* PFVLVF, PFVLVFB: set up filters for vlan tags as configured */
2553         for (i = 0; i < cfg->nb_pool_maps; i++) {
2554                 /* set vlan id in VF register and set the valid bit */
2555                 IXGBE_WRITE_REG(hw, IXGBE_VLVF(i), (IXGBE_VLVF_VIEN | \
2556                                 (cfg->pool_map[i].vlan_id & 0xFFF)));
2557                 /*
2558                  * Put the allowed pools in VFB reg. As we only have 16 or 32
2559                  * pools, we only need to use the first half of the register
2560                  * i.e. bits 0-31
2561                  */
2562                 IXGBE_WRITE_REG(hw, IXGBE_VLVFB(i*2), cfg->pool_map[i].pools);
2563         }
2564 }
2565
2566 /**
2567  * ixgbe_dcb_config_tx_hw_config - Configure general DCB TX parameters
2568  * @hw: pointer to hardware structure
2569  * @dcb_config: pointer to ixgbe_dcb_config structure
2570  */
2571 static void 
2572 ixgbe_dcb_tx_hw_config(struct ixgbe_hw *hw,
2573                struct ixgbe_dcb_config *dcb_config)
2574 {
2575         uint32_t reg;
2576         uint32_t q;
2577         
2578         PMD_INIT_FUNC_TRACE();
2579         if (hw->mac.type != ixgbe_mac_82598EB) {
2580                 /* Disable the Tx desc arbiter so that MTQC can be changed */
2581                 reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
2582                 reg |= IXGBE_RTTDCS_ARBDIS;
2583                 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
2584
2585                 /* Enable DCB for Tx with 8 TCs */
2586                 if (dcb_config->num_tcs.pg_tcs == 8) {
2587                         reg = IXGBE_MTQC_RT_ENA | IXGBE_MTQC_8TC_8TQ;
2588                 }
2589                 else {
2590                         reg = IXGBE_MTQC_RT_ENA | IXGBE_MTQC_4TC_4TQ;
2591                 }
2592                 if (dcb_config->vt_mode)
2593                     reg |= IXGBE_MTQC_VT_ENA;
2594                 IXGBE_WRITE_REG(hw, IXGBE_MTQC, reg);
2595
2596                 /* Disable drop for all queues */
2597                 for (q = 0; q < 128; q++)
2598                         IXGBE_WRITE_REG(hw, IXGBE_QDE,
2599                      (IXGBE_QDE_WRITE | (q << IXGBE_QDE_IDX_SHIFT)));
2600
2601                 /* Enable the Tx desc arbiter */
2602                 reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
2603                 reg &= ~IXGBE_RTTDCS_ARBDIS;
2604                 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
2605
2606                 /* Enable Security TX Buffer IFG for DCB */
2607                 reg = IXGBE_READ_REG(hw, IXGBE_SECTXMINIFG);
2608                 reg |= IXGBE_SECTX_DCB;
2609                 IXGBE_WRITE_REG(hw, IXGBE_SECTXMINIFG, reg);
2610         }
2611         return;
2612 }
2613
2614 /**
2615  * ixgbe_vmdq_dcb_hw_tx_config - Configure general VMDQ+DCB TX parameters
2616  * @dev: pointer to rte_eth_dev structure
2617  * @dcb_config: pointer to ixgbe_dcb_config structure
2618  */
2619 static void
2620 ixgbe_vmdq_dcb_hw_tx_config(struct rte_eth_dev *dev,
2621                         struct ixgbe_dcb_config *dcb_config)
2622 {
2623         struct rte_eth_vmdq_dcb_tx_conf *vmdq_tx_conf =
2624                         &dev->data->dev_conf.tx_adv_conf.vmdq_dcb_tx_conf;
2625         struct ixgbe_hw *hw = 
2626                         IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2627         
2628         PMD_INIT_FUNC_TRACE();
2629         if (hw->mac.type != ixgbe_mac_82598EB)  
2630                 /*PF VF Transmit Enable*/
2631                 IXGBE_WRITE_REG(hw, IXGBE_VFTE(0),
2632                         vmdq_tx_conf->nb_queue_pools == ETH_16_POOLS ? 0xFFFF : 0xFFFFFFFF);
2633     
2634         /*Configure general DCB TX parameters*/
2635         ixgbe_dcb_tx_hw_config(hw,dcb_config);
2636         return;
2637 }
2638
2639 static void 
2640 ixgbe_vmdq_dcb_rx_config(struct rte_eth_dev *dev,
2641                         struct ixgbe_dcb_config *dcb_config)
2642 {
2643         struct rte_eth_vmdq_dcb_conf *vmdq_rx_conf =
2644                         &dev->data->dev_conf.rx_adv_conf.vmdq_dcb_conf;
2645         struct ixgbe_dcb_tc_config *tc;
2646         uint8_t i,j;
2647
2648         /* convert rte_eth_conf.rx_adv_conf to struct ixgbe_dcb_config */
2649         if (vmdq_rx_conf->nb_queue_pools == ETH_16_POOLS ) {
2650                 dcb_config->num_tcs.pg_tcs = ETH_8_TCS;
2651                 dcb_config->num_tcs.pfc_tcs = ETH_8_TCS;
2652         }
2653         else {
2654                 dcb_config->num_tcs.pg_tcs = ETH_4_TCS;
2655                 dcb_config->num_tcs.pfc_tcs = ETH_4_TCS;
2656         }
2657         /* User Priority to Traffic Class mapping */
2658         for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2659                 j = vmdq_rx_conf->dcb_queue[i];
2660                 tc = &dcb_config->tc_config[j];
2661                 tc->path[IXGBE_DCB_RX_CONFIG].up_to_tc_bitmap =
2662                                                 (uint8_t)(1 << j);
2663         }
2664 }
2665
2666 static void 
2667 ixgbe_dcb_vt_tx_config(struct rte_eth_dev *dev,
2668                         struct ixgbe_dcb_config *dcb_config)
2669
2670         struct rte_eth_vmdq_dcb_tx_conf *vmdq_tx_conf =
2671                         &dev->data->dev_conf.tx_adv_conf.vmdq_dcb_tx_conf;
2672         struct ixgbe_dcb_tc_config *tc;
2673         uint8_t i,j;
2674         
2675         /* convert rte_eth_conf.rx_adv_conf to struct ixgbe_dcb_config */
2676         if (vmdq_tx_conf->nb_queue_pools == ETH_16_POOLS ) {
2677                 dcb_config->num_tcs.pg_tcs = ETH_8_TCS;
2678                 dcb_config->num_tcs.pfc_tcs = ETH_8_TCS;
2679         }
2680         else {
2681                 dcb_config->num_tcs.pg_tcs = ETH_4_TCS;
2682                 dcb_config->num_tcs.pfc_tcs = ETH_4_TCS;
2683         }
2684
2685         /* User Priority to Traffic Class mapping */
2686         for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2687                 j = vmdq_tx_conf->dcb_queue[i];
2688                 tc = &dcb_config->tc_config[j];
2689                 tc->path[IXGBE_DCB_TX_CONFIG].up_to_tc_bitmap =
2690                                                 (uint8_t)(1 << j);
2691         }
2692         return;
2693 }
2694
2695 static void 
2696 ixgbe_dcb_rx_config(struct rte_eth_dev *dev,
2697                 struct ixgbe_dcb_config *dcb_config)
2698 {
2699         struct rte_eth_dcb_rx_conf *rx_conf =
2700                         &dev->data->dev_conf.rx_adv_conf.dcb_rx_conf;
2701         struct ixgbe_dcb_tc_config *tc;
2702         uint8_t i,j;
2703
2704         dcb_config->num_tcs.pg_tcs = (uint8_t)rx_conf->nb_tcs;
2705         dcb_config->num_tcs.pfc_tcs = (uint8_t)rx_conf->nb_tcs;
2706         
2707         /* User Priority to Traffic Class mapping */ 
2708         for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2709                 j = rx_conf->dcb_queue[i];
2710                 tc = &dcb_config->tc_config[j];
2711                 tc->path[IXGBE_DCB_RX_CONFIG].up_to_tc_bitmap =
2712                                                 (uint8_t)(1 << j);
2713         }
2714 }
2715
2716 static void 
2717 ixgbe_dcb_tx_config(struct rte_eth_dev *dev,
2718                 struct ixgbe_dcb_config *dcb_config)
2719 {
2720         struct rte_eth_dcb_tx_conf *tx_conf =
2721                         &dev->data->dev_conf.tx_adv_conf.dcb_tx_conf;
2722         struct ixgbe_dcb_tc_config *tc;
2723         uint8_t i,j;
2724
2725         dcb_config->num_tcs.pg_tcs = (uint8_t)tx_conf->nb_tcs;
2726         dcb_config->num_tcs.pfc_tcs = (uint8_t)tx_conf->nb_tcs;
2727     
2728         /* User Priority to Traffic Class mapping */ 
2729         for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2730                 j = tx_conf->dcb_queue[i];
2731                 tc = &dcb_config->tc_config[j];
2732                 tc->path[IXGBE_DCB_TX_CONFIG].up_to_tc_bitmap =
2733                                                 (uint8_t)(1 << j);
2734         }
2735 }
2736
2737 /**
2738  * ixgbe_dcb_rx_hw_config - Configure general DCB RX HW parameters
2739  * @hw: pointer to hardware structure
2740  * @dcb_config: pointer to ixgbe_dcb_config structure
2741  */
2742 static void
2743 ixgbe_dcb_rx_hw_config(struct ixgbe_hw *hw,
2744                struct ixgbe_dcb_config *dcb_config)
2745 {
2746         uint32_t reg;
2747         uint32_t vlanctrl;
2748         uint8_t i;
2749
2750         PMD_INIT_FUNC_TRACE();
2751         /*
2752          * Disable the arbiter before changing parameters
2753          * (always enable recycle mode; WSP)
2754          */
2755         reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC | IXGBE_RTRPCS_ARBDIS;
2756         IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
2757
2758         if (hw->mac.type != ixgbe_mac_82598EB) {
2759                 reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
2760                 if (dcb_config->num_tcs.pg_tcs == 4) {
2761                         if (dcb_config->vt_mode)
2762                                 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
2763                                         IXGBE_MRQC_VMDQRT4TCEN;
2764                         else {
2765                                 IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, 0);
2766                                 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
2767                                         IXGBE_MRQC_RT4TCEN;
2768                         }
2769                 }
2770                 if (dcb_config->num_tcs.pg_tcs == 8) {
2771                         if (dcb_config->vt_mode)
2772                                 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
2773                                         IXGBE_MRQC_VMDQRT8TCEN;
2774                         else {
2775                                 IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, 0);
2776                                 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
2777                                         IXGBE_MRQC_RT8TCEN;
2778                         }
2779                 }
2780
2781                 IXGBE_WRITE_REG(hw, IXGBE_MRQC, reg);
2782         }
2783
2784         /* VLNCTRL: enable vlan filtering and allow all vlan tags through */
2785         vlanctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
2786         vlanctrl |= IXGBE_VLNCTRL_VFE ; /* enable vlan filters */
2787         IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlanctrl);
2788  
2789         /* VFTA - enable all vlan filters */
2790         for (i = 0; i < NUM_VFTA_REGISTERS; i++) {
2791                 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i), 0xFFFFFFFF);
2792         }
2793
2794         /*
2795          * Configure Rx packet plane (recycle mode; WSP) and
2796          * enable arbiter
2797          */
2798         reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC;
2799         IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
2800  
2801         return;
2802 }
2803
2804 static void 
2805 ixgbe_dcb_hw_arbite_rx_config(struct ixgbe_hw *hw, uint16_t *refill,
2806                         uint16_t *max,uint8_t *bwg_id, uint8_t *tsa, uint8_t *map)
2807 {
2808         switch (hw->mac.type) {
2809         case ixgbe_mac_82598EB:
2810                 ixgbe_dcb_config_rx_arbiter_82598(hw, refill, max, tsa);
2811                 break;
2812         case ixgbe_mac_82599EB:
2813         case ixgbe_mac_X540:
2814                 ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id,
2815                                                   tsa, map);
2816                 break;
2817         default:
2818                 break;
2819         }
2820 }
2821
2822 static void 
2823 ixgbe_dcb_hw_arbite_tx_config(struct ixgbe_hw *hw, uint16_t *refill, uint16_t *max,
2824                             uint8_t *bwg_id, uint8_t *tsa, uint8_t *map)
2825 {
2826         switch (hw->mac.type) {
2827         case ixgbe_mac_82598EB:
2828                 ixgbe_dcb_config_tx_desc_arbiter_82598(hw, refill, max, bwg_id,tsa);
2829                 ixgbe_dcb_config_tx_data_arbiter_82598(hw, refill, max, bwg_id,tsa);
2830                 break;
2831         case ixgbe_mac_82599EB:
2832         case ixgbe_mac_X540:
2833                 ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max, bwg_id,tsa);
2834                 ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max, bwg_id,tsa, map);
2835                 break;
2836         default:
2837                 break;
2838         }
2839 }
2840
2841 #define DCB_RX_CONFIG  1
2842 #define DCB_TX_CONFIG  1
2843 #define DCB_TX_PB      1024
2844 /**
2845  * ixgbe_dcb_hw_configure - Enable DCB and configure 
2846  * general DCB in VT mode and non-VT mode parameters
2847  * @dev: pointer to rte_eth_dev structure
2848  * @dcb_config: pointer to ixgbe_dcb_config structure
2849  */
2850 static int
2851 ixgbe_dcb_hw_configure(struct rte_eth_dev *dev,
2852                         struct ixgbe_dcb_config *dcb_config)
2853 {
2854         int     ret = 0;
2855         uint8_t i,pfc_en,nb_tcs;
2856         uint16_t pbsize;
2857         uint8_t config_dcb_rx = 0;
2858         uint8_t config_dcb_tx = 0;
2859         uint8_t tsa[IXGBE_DCB_MAX_TRAFFIC_CLASS] = {0};
2860         uint8_t bwgid[IXGBE_DCB_MAX_TRAFFIC_CLASS] = {0};
2861         uint16_t refill[IXGBE_DCB_MAX_TRAFFIC_CLASS] = {0};
2862         uint16_t max[IXGBE_DCB_MAX_TRAFFIC_CLASS] = {0};
2863         uint8_t map[IXGBE_DCB_MAX_TRAFFIC_CLASS] = {0};
2864         struct ixgbe_dcb_tc_config *tc;
2865         uint32_t max_frame = dev->data->max_frame_size;
2866         struct ixgbe_hw *hw = 
2867                         IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2868
2869         switch(dev->data->dev_conf.rxmode.mq_mode){
2870         case ETH_MQ_RX_VMDQ_DCB:
2871                 dcb_config->vt_mode = true;
2872                 if (hw->mac.type != ixgbe_mac_82598EB) {
2873                         config_dcb_rx = DCB_RX_CONFIG;
2874                         /*
2875                          *get dcb and VT rx configuration parameters 
2876                          *from rte_eth_conf
2877                          */
2878                         ixgbe_vmdq_dcb_rx_config(dev,dcb_config);
2879                         /*Configure general VMDQ and DCB RX parameters*/
2880                         ixgbe_vmdq_dcb_configure(dev);
2881                 }
2882                 break;
2883         case ETH_MQ_RX_DCB:
2884                 dcb_config->vt_mode = false;
2885                 config_dcb_rx = DCB_RX_CONFIG;
2886                 /* Get dcb TX configuration parameters from rte_eth_conf */
2887                 ixgbe_dcb_rx_config(dev,dcb_config);
2888                 /*Configure general DCB RX parameters*/
2889                 ixgbe_dcb_rx_hw_config(hw, dcb_config);
2890                 break;
2891         default:
2892                 PMD_INIT_LOG(ERR, "Incorrect DCB RX mode configuration\n");
2893                 break;
2894         }
2895         switch (dev->data->dev_conf.txmode.mq_mode) {
2896         case ETH_MQ_TX_VMDQ_DCB:
2897                 dcb_config->vt_mode = true;
2898                 config_dcb_tx = DCB_TX_CONFIG;
2899                 /* get DCB and VT TX configuration parameters from rte_eth_conf */
2900                 ixgbe_dcb_vt_tx_config(dev,dcb_config);
2901                 /*Configure general VMDQ and DCB TX parameters*/
2902                 ixgbe_vmdq_dcb_hw_tx_config(dev,dcb_config);
2903                 break;
2904
2905         case ETH_MQ_TX_DCB:
2906                 dcb_config->vt_mode = false;
2907                 config_dcb_tx = DCB_TX_CONFIG;
2908                 /*get DCB TX configuration parameters from rte_eth_conf*/
2909                 ixgbe_dcb_tx_config(dev,dcb_config);
2910                 /*Configure general DCB TX parameters*/
2911                 ixgbe_dcb_tx_hw_config(hw, dcb_config);
2912                 break;
2913         default:
2914                 PMD_INIT_LOG(ERR, "Incorrect DCB TX mode configuration\n");
2915                 break;
2916         }
2917
2918         nb_tcs = dcb_config->num_tcs.pfc_tcs;
2919         /* Unpack map */
2920         ixgbe_dcb_unpack_map_cee(dcb_config, IXGBE_DCB_RX_CONFIG, map);
2921         if(nb_tcs == ETH_4_TCS) {
2922                 /* Avoid un-configured priority mapping to TC0 */
2923                 uint8_t j = 4;
2924                 uint8_t mask = 0xFF;
2925                 for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES - 4; i++) 
2926                         mask = (uint8_t)(mask & (~ (1 << map[i])));
2927                 for (i = 0; mask && (i < IXGBE_DCB_MAX_TRAFFIC_CLASS); i++) {
2928                         if ((mask & 0x1) && (j < ETH_DCB_NUM_USER_PRIORITIES))
2929                                 map[j++] = i;
2930                         mask >>= 1;
2931                 }
2932                 /* Re-configure 4 TCs BW */
2933                 for (i = 0; i < nb_tcs; i++) {
2934                         tc = &dcb_config->tc_config[i];
2935                         tc->path[IXGBE_DCB_TX_CONFIG].bwg_percent =
2936                                                 (uint8_t)(100 / nb_tcs);
2937                         tc->path[IXGBE_DCB_RX_CONFIG].bwg_percent =
2938                                                 (uint8_t)(100 / nb_tcs);
2939                 }
2940                 for (; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
2941                         tc = &dcb_config->tc_config[i];
2942                         tc->path[IXGBE_DCB_TX_CONFIG].bwg_percent = 0;
2943                         tc->path[IXGBE_DCB_RX_CONFIG].bwg_percent = 0;
2944                 }
2945         }
2946
2947         if(config_dcb_rx) {
2948                 /* Set RX buffer size */
2949                 pbsize = (uint16_t)(NIC_RX_BUFFER_SIZE / nb_tcs);
2950                 uint32_t rxpbsize = pbsize << IXGBE_RXPBSIZE_SHIFT;
2951                 for (i = 0 ; i < nb_tcs; i++) {
2952                         IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpbsize);
2953                 }
2954                 /* zero alloc all unused TCs */
2955                 for (; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2956                         IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), 0);
2957                 }
2958         }
2959         if(config_dcb_tx) {
2960                 /* Only support an equally distributed Tx packet buffer strategy. */
2961                 uint32_t txpktsize = IXGBE_TXPBSIZE_MAX / nb_tcs;
2962                 uint32_t txpbthresh = (txpktsize / DCB_TX_PB) - IXGBE_TXPKT_SIZE_MAX;
2963                 for (i = 0; i < nb_tcs; i++) {
2964                         IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), txpktsize);
2965                         IXGBE_WRITE_REG(hw, IXGBE_TXPBTHRESH(i), txpbthresh);
2966                 }
2967                 /* Clear unused TCs, if any, to zero buffer size*/
2968                 for (; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2969                         IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), 0);
2970                         IXGBE_WRITE_REG(hw, IXGBE_TXPBTHRESH(i), 0);
2971                 }
2972         }
2973
2974         /*Calculates traffic class credits*/
2975         ixgbe_dcb_calculate_tc_credits_cee(hw, dcb_config,max_frame,
2976                                 IXGBE_DCB_TX_CONFIG);
2977         ixgbe_dcb_calculate_tc_credits_cee(hw, dcb_config,max_frame,
2978                                 IXGBE_DCB_RX_CONFIG);
2979
2980         if(config_dcb_rx) {
2981                 /* Unpack CEE standard containers */
2982                 ixgbe_dcb_unpack_refill_cee(dcb_config, IXGBE_DCB_RX_CONFIG, refill);
2983                 ixgbe_dcb_unpack_max_cee(dcb_config, max);
2984                 ixgbe_dcb_unpack_bwgid_cee(dcb_config, IXGBE_DCB_RX_CONFIG, bwgid);
2985                 ixgbe_dcb_unpack_tsa_cee(dcb_config, IXGBE_DCB_RX_CONFIG, tsa);
2986                 /* Configure PG(ETS) RX */
2987                 ixgbe_dcb_hw_arbite_rx_config(hw,refill,max,bwgid,tsa,map);
2988         }
2989
2990         if(config_dcb_tx) {
2991                 /* Unpack CEE standard containers */
2992                 ixgbe_dcb_unpack_refill_cee(dcb_config, IXGBE_DCB_TX_CONFIG, refill);
2993                 ixgbe_dcb_unpack_max_cee(dcb_config, max);
2994                 ixgbe_dcb_unpack_bwgid_cee(dcb_config, IXGBE_DCB_TX_CONFIG, bwgid);
2995                 ixgbe_dcb_unpack_tsa_cee(dcb_config, IXGBE_DCB_TX_CONFIG, tsa);
2996                 /* Configure PG(ETS) TX */
2997                 ixgbe_dcb_hw_arbite_tx_config(hw,refill,max,bwgid,tsa,map);
2998         }
2999
3000         /*Configure queue statistics registers*/
3001         ixgbe_dcb_config_tc_stats_82599(hw, dcb_config);
3002
3003         /* Check if the PFC is supported */
3004         if(dev->data->dev_conf.dcb_capability_en & ETH_DCB_PFC_SUPPORT) {
3005                 pbsize = (uint16_t) (NIC_RX_BUFFER_SIZE / nb_tcs);
3006                 for (i = 0; i < nb_tcs; i++) {
3007                         /*
3008                         * If the TC count is 8,and the default high_water is 48,
3009                         * the low_water is 16 as default.
3010                         */
3011                         hw->fc.high_water[i] = (pbsize * 3 ) / 4;
3012                         hw->fc.low_water[i] = pbsize / 4;
3013                         /* Enable pfc for this TC */
3014                         tc = &dcb_config->tc_config[i];
3015                         tc->pfc = ixgbe_dcb_pfc_enabled;
3016                 }
3017                 ixgbe_dcb_unpack_pfc_cee(dcb_config, map, &pfc_en);
3018                 if(dcb_config->num_tcs.pfc_tcs == ETH_4_TCS)
3019                         pfc_en &= 0x0F;
3020                 ret = ixgbe_dcb_config_pfc(hw, pfc_en, map);
3021         }
3022
3023         return ret;
3024 }
3025
3026 /**
3027  * ixgbe_configure_dcb - Configure DCB  Hardware
3028  * @dev: pointer to rte_eth_dev
3029  */
3030 void ixgbe_configure_dcb(struct rte_eth_dev *dev)
3031 {
3032         struct ixgbe_dcb_config *dcb_cfg =
3033                         IXGBE_DEV_PRIVATE_TO_DCB_CFG(dev->data->dev_private); 
3034         struct rte_eth_conf *dev_conf = &(dev->data->dev_conf);
3035         
3036         PMD_INIT_FUNC_TRACE();  
3037         
3038         /* check support mq_mode for DCB */
3039         if ((dev_conf->rxmode.mq_mode != ETH_MQ_RX_VMDQ_DCB) && 
3040             (dev_conf->rxmode.mq_mode != ETH_MQ_RX_DCB)) 
3041                 return;
3042
3043         if (dev->data->nb_rx_queues != ETH_DCB_NUM_QUEUES)
3044                 return;
3045
3046         /** Configure DCB hardware **/
3047         ixgbe_dcb_hw_configure(dev,dcb_cfg);
3048         
3049         return;
3050 }
3051
3052 /*
3053  * VMDq only support for 10 GbE NIC.
3054  */
3055 static void
3056 ixgbe_vmdq_rx_hw_configure(struct rte_eth_dev *dev)
3057 {
3058         struct rte_eth_vmdq_rx_conf *cfg;
3059         struct ixgbe_hw *hw;
3060         enum rte_eth_nb_pools num_pools;
3061         uint32_t mrqc, vt_ctl, vlanctrl;
3062         int i;
3063
3064         PMD_INIT_FUNC_TRACE();
3065         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3066         cfg = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;
3067         num_pools = cfg->nb_queue_pools;
3068
3069         ixgbe_rss_disable(dev);
3070
3071         /* MRQC: enable vmdq */
3072         mrqc = IXGBE_MRQC_VMDQEN;
3073         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
3074
3075         /* PFVTCTL: turn on virtualisation and set the default pool */
3076         vt_ctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
3077         if (cfg->enable_default_pool)
3078                 vt_ctl |= (cfg->default_pool << IXGBE_VT_CTL_POOL_SHIFT);
3079         else
3080                 vt_ctl |= IXGBE_VT_CTL_DIS_DEFPL;
3081
3082         IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vt_ctl);
3083
3084         /* VLNCTRL: enable vlan filtering and allow all vlan tags through */
3085         vlanctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
3086         vlanctrl |= IXGBE_VLNCTRL_VFE ; /* enable vlan filters */
3087         IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlanctrl);
3088
3089         /* VFTA - enable all vlan filters */
3090         for (i = 0; i < NUM_VFTA_REGISTERS; i++) 
3091                 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i), UINT32_MAX);
3092
3093         /* VFRE: pool enabling for receive - 64 */
3094         IXGBE_WRITE_REG(hw, IXGBE_VFRE(0), UINT32_MAX);
3095         if (num_pools == ETH_64_POOLS)
3096                 IXGBE_WRITE_REG(hw, IXGBE_VFRE(1), UINT32_MAX);
3097
3098         /*
3099          * MPSAR - allow pools to read specific mac addresses
3100          * In this case, all pools should be able to read from mac addr 0
3101          */
3102         IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(0), UINT32_MAX);
3103         IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(0), UINT32_MAX);
3104
3105         /* PFVLVF, PFVLVFB: set up filters for vlan tags as configured */
3106         for (i = 0; i < cfg->nb_pool_maps; i++) {
3107                 /* set vlan id in VF register and set the valid bit */
3108                 IXGBE_WRITE_REG(hw, IXGBE_VLVF(i), (IXGBE_VLVF_VIEN | \
3109                                 (cfg->pool_map[i].vlan_id & IXGBE_RXD_VLAN_ID_MASK)));
3110                 /*
3111                  * Put the allowed pools in VFB reg. As we only have 16 or 64
3112                  * pools, we only need to use the first half of the register
3113                  * i.e. bits 0-31
3114                  */
3115                 if (((cfg->pool_map[i].pools >> 32) & UINT32_MAX) == 0) 
3116                         IXGBE_WRITE_REG(hw, IXGBE_VLVFB(i*2), \
3117                                         (cfg->pool_map[i].pools & UINT32_MAX));
3118                 else
3119                         IXGBE_WRITE_REG(hw, IXGBE_VLVFB((i*2+1)), \
3120                                         ((cfg->pool_map[i].pools >> 32) \
3121                                         & UINT32_MAX));
3122
3123         }
3124
3125         IXGBE_WRITE_FLUSH(hw);
3126 }
3127
3128 /*
3129  * ixgbe_dcb_config_tx_hw_config - Configure general VMDq TX parameters
3130  * @hw: pointer to hardware structure
3131  */
3132 static void 
3133 ixgbe_vmdq_tx_hw_configure(struct ixgbe_hw *hw)
3134 {
3135         uint32_t reg;
3136         uint32_t q;
3137         
3138         PMD_INIT_FUNC_TRACE();
3139         /*PF VF Transmit Enable*/
3140         IXGBE_WRITE_REG(hw, IXGBE_VFTE(0), UINT32_MAX);
3141         IXGBE_WRITE_REG(hw, IXGBE_VFTE(1), UINT32_MAX);
3142
3143         /* Disable the Tx desc arbiter so that MTQC can be changed */
3144         reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
3145         reg |= IXGBE_RTTDCS_ARBDIS;
3146         IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
3147
3148         reg = IXGBE_MTQC_VT_ENA | IXGBE_MTQC_64VF;
3149         IXGBE_WRITE_REG(hw, IXGBE_MTQC, reg);
3150
3151         /* Disable drop for all queues */
3152         for (q = 0; q < IXGBE_MAX_RX_QUEUE_NUM; q++)
3153                 IXGBE_WRITE_REG(hw, IXGBE_QDE,
3154                   (IXGBE_QDE_WRITE | (q << IXGBE_QDE_IDX_SHIFT)));
3155
3156         /* Enable the Tx desc arbiter */
3157         reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
3158         reg &= ~IXGBE_RTTDCS_ARBDIS;
3159         IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
3160
3161         IXGBE_WRITE_FLUSH(hw);
3162
3163         return;
3164 }
3165
3166 static int
3167 ixgbe_alloc_rx_queue_mbufs(struct igb_rx_queue *rxq)
3168 {
3169         struct igb_rx_entry *rxe = rxq->sw_ring;
3170         uint64_t dma_addr;
3171         unsigned i;
3172
3173         /* Initialize software ring entries */
3174         for (i = 0; i < rxq->nb_rx_desc; i++) {
3175                 volatile union ixgbe_adv_rx_desc *rxd;
3176                 struct rte_mbuf *mbuf = rte_rxmbuf_alloc(rxq->mb_pool);
3177                 if (mbuf == NULL) {
3178                         PMD_INIT_LOG(ERR, "RX mbuf alloc failed queue_id=%u\n",
3179                                      (unsigned) rxq->queue_id);
3180                         return (-ENOMEM);
3181                 }
3182
3183                 rte_mbuf_refcnt_set(mbuf, 1);
3184                 mbuf->type = RTE_MBUF_PKT;
3185                 mbuf->pkt.next = NULL;
3186                 mbuf->pkt.data = (char *)mbuf->buf_addr + RTE_PKTMBUF_HEADROOM;
3187                 mbuf->pkt.nb_segs = 1;
3188                 mbuf->pkt.in_port = rxq->port_id;
3189
3190                 dma_addr =
3191                         rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mbuf));
3192                 rxd = &rxq->rx_ring[i];
3193                 rxd->read.hdr_addr = dma_addr;
3194                 rxd->read.pkt_addr = dma_addr;
3195                 rxe[i].mbuf = mbuf;
3196         }
3197
3198         return 0;
3199 }
3200
3201 static int
3202 ixgbe_dev_mq_rx_configure(struct rte_eth_dev *dev)
3203 {
3204         struct ixgbe_hw *hw = 
3205                 IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3206
3207         if (hw->mac.type == ixgbe_mac_82598EB)
3208                 return 0;
3209
3210         if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
3211                 /* 
3212                  * SRIOV inactive scheme
3213                  * any DCB/RSS w/o VMDq multi-queue setting
3214                  */
3215                 if (dev->data->nb_rx_queues > 1)
3216                         switch (dev->data->dev_conf.rxmode.mq_mode) {
3217                         case ETH_MQ_RX_NONE:
3218                                 /* if mq_mode not assign, we use rss mode.*/
3219                         case ETH_MQ_RX_RSS:
3220                                 ixgbe_rss_configure(dev);
3221                                 break;
3222
3223                         case ETH_MQ_RX_VMDQ_DCB:
3224                                 ixgbe_vmdq_dcb_configure(dev);
3225                                 break;
3226         
3227                         case ETH_MQ_RX_VMDQ_ONLY:
3228                                 ixgbe_vmdq_rx_hw_configure(dev);
3229                                 break;
3230                         
3231                         default: ixgbe_rss_disable(dev);
3232                         }
3233                 else
3234                         ixgbe_rss_disable(dev);
3235         } else {
3236                 switch (RTE_ETH_DEV_SRIOV(dev).active) {
3237                 /*
3238                  * SRIOV active scheme
3239                  * FIXME if support DCB/RSS together with VMDq & SRIOV
3240                  */
3241                 case ETH_64_POOLS:
3242                         IXGBE_WRITE_REG(hw, IXGBE_MRQC, IXGBE_MRQC_VMDQEN);
3243                         break;
3244
3245                 case ETH_32_POOLS:
3246                         IXGBE_WRITE_REG(hw, IXGBE_MRQC, IXGBE_MRQC_VMDQRT4TCEN);
3247                         break;
3248                 
3249                 case ETH_16_POOLS:
3250                         IXGBE_WRITE_REG(hw, IXGBE_MRQC, IXGBE_MRQC_VMDQRT8TCEN);
3251                         break;
3252                 default:
3253                         RTE_LOG(ERR, PMD, "invalid pool number in IOV mode\n");
3254                 }
3255         }
3256
3257         return 0;
3258 }
3259
3260 static int
3261 ixgbe_dev_mq_tx_configure(struct rte_eth_dev *dev)
3262 {
3263         struct ixgbe_hw *hw = 
3264                 IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3265         uint32_t mtqc;
3266         uint32_t rttdcs;
3267
3268         if (hw->mac.type == ixgbe_mac_82598EB)
3269                 return 0;
3270
3271         /* disable arbiter before setting MTQC */
3272         rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
3273         rttdcs |= IXGBE_RTTDCS_ARBDIS;
3274         IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
3275
3276         if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
3277                 /* 
3278                  * SRIOV inactive scheme
3279                  * any DCB w/o VMDq multi-queue setting
3280                  */
3281                 if (dev->data->dev_conf.txmode.mq_mode == ETH_MQ_TX_VMDQ_ONLY)
3282                         ixgbe_vmdq_tx_hw_configure(hw);
3283                 else {
3284                         mtqc = IXGBE_MTQC_64Q_1PB;
3285                         IXGBE_WRITE_REG(hw, IXGBE_MTQC, mtqc);
3286                 }
3287         } else {
3288                 switch (RTE_ETH_DEV_SRIOV(dev).active) {
3289
3290                 /*
3291                  * SRIOV active scheme
3292                  * FIXME if support DCB together with VMDq & SRIOV
3293                  */
3294                 case ETH_64_POOLS:
3295                         mtqc = IXGBE_MTQC_VT_ENA | IXGBE_MTQC_64VF;
3296                         break;
3297                 case ETH_32_POOLS:
3298                         mtqc = IXGBE_MTQC_VT_ENA | IXGBE_MTQC_32VF;
3299                         break;
3300                 case ETH_16_POOLS:
3301                         mtqc = IXGBE_MTQC_VT_ENA | IXGBE_MTQC_RT_ENA | 
3302                                 IXGBE_MTQC_8TC_8TQ;
3303                         break;
3304                 default:
3305                         mtqc = IXGBE_MTQC_64Q_1PB;
3306                         RTE_LOG(ERR, PMD, "invalid pool number in IOV mode\n");
3307                 }
3308                 IXGBE_WRITE_REG(hw, IXGBE_MTQC, mtqc);
3309         }
3310
3311         /* re-enable arbiter */
3312         rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
3313         IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
3314
3315         return 0;
3316 }
3317
3318 /*
3319  * Initializes Receive Unit.
3320  */
3321 int
3322 ixgbe_dev_rx_init(struct rte_eth_dev *dev)
3323 {
3324         struct ixgbe_hw     *hw;
3325         struct igb_rx_queue *rxq;
3326         struct rte_pktmbuf_pool_private *mbp_priv;
3327         uint64_t bus_addr;
3328         uint32_t rxctrl;
3329         uint32_t fctrl;
3330         uint32_t hlreg0;
3331         uint32_t maxfrs;
3332         uint32_t srrctl;
3333         uint32_t rdrxctl;
3334         uint32_t rxcsum;
3335         uint16_t buf_size;
3336         uint16_t i;
3337         int ret;
3338         
3339         PMD_INIT_FUNC_TRACE();
3340         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3341
3342         /*
3343          * Make sure receives are disabled while setting
3344          * up the RX context (registers, descriptor rings, etc.).
3345          */
3346         rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
3347         IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl & ~IXGBE_RXCTRL_RXEN);
3348
3349         /* Enable receipt of broadcasted frames */
3350         fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
3351         fctrl |= IXGBE_FCTRL_BAM;
3352         fctrl |= IXGBE_FCTRL_DPF;
3353         fctrl |= IXGBE_FCTRL_PMCF;
3354         IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
3355
3356         /*
3357          * Configure CRC stripping, if any.
3358          */
3359         hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
3360         if (dev->data->dev_conf.rxmode.hw_strip_crc)
3361                 hlreg0 |= IXGBE_HLREG0_RXCRCSTRP;
3362         else
3363                 hlreg0 &= ~IXGBE_HLREG0_RXCRCSTRP;
3364
3365         /*
3366          * Configure jumbo frame support, if any.
3367          */
3368         if (dev->data->dev_conf.rxmode.jumbo_frame == 1) {
3369                 hlreg0 |= IXGBE_HLREG0_JUMBOEN;
3370                 maxfrs = IXGBE_READ_REG(hw, IXGBE_MAXFRS);
3371                 maxfrs &= 0x0000FFFF;
3372                 maxfrs |= (dev->data->dev_conf.rxmode.max_rx_pkt_len << 16);
3373                 IXGBE_WRITE_REG(hw, IXGBE_MAXFRS, maxfrs);
3374         } else
3375                 hlreg0 &= ~IXGBE_HLREG0_JUMBOEN;
3376
3377         IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
3378
3379         /* Setup RX queues */
3380         for (i = 0; i < dev->data->nb_rx_queues; i++) {
3381                 rxq = dev->data->rx_queues[i];
3382
3383                 /* Allocate buffers for descriptor rings */
3384                 ret = ixgbe_alloc_rx_queue_mbufs(rxq);
3385                 if (ret)
3386                         return ret;
3387
3388                 /*
3389                  * Reset crc_len in case it was changed after queue setup by a
3390                  * call to configure.
3391                  */
3392                 rxq->crc_len = (uint8_t)
3393                                 ((dev->data->dev_conf.rxmode.hw_strip_crc) ? 0 :
3394                                 ETHER_CRC_LEN);
3395
3396                 /* Setup the Base and Length of the Rx Descriptor Rings */
3397                 bus_addr = rxq->rx_ring_phys_addr;
3398                 IXGBE_WRITE_REG(hw, IXGBE_RDBAL(rxq->reg_idx),
3399                                 (uint32_t)(bus_addr & 0x00000000ffffffffULL));
3400                 IXGBE_WRITE_REG(hw, IXGBE_RDBAH(rxq->reg_idx),
3401                                 (uint32_t)(bus_addr >> 32));
3402                 IXGBE_WRITE_REG(hw, IXGBE_RDLEN(rxq->reg_idx),
3403                                 rxq->nb_rx_desc * sizeof(union ixgbe_adv_rx_desc));
3404                 IXGBE_WRITE_REG(hw, IXGBE_RDH(rxq->reg_idx), 0);
3405                 IXGBE_WRITE_REG(hw, IXGBE_RDT(rxq->reg_idx), 0);
3406
3407                 /* Configure the SRRCTL register */
3408 #ifdef RTE_HEADER_SPLIT_ENABLE
3409                 /*
3410                  * Configure Header Split
3411                  */
3412                 if (dev->data->dev_conf.rxmode.header_split) {
3413                         if (hw->mac.type == ixgbe_mac_82599EB) {
3414                                 /* Must setup the PSRTYPE register */
3415                                 uint32_t psrtype;
3416                                 psrtype = IXGBE_PSRTYPE_TCPHDR |
3417                                         IXGBE_PSRTYPE_UDPHDR   |
3418                                         IXGBE_PSRTYPE_IPV4HDR  |
3419                                         IXGBE_PSRTYPE_IPV6HDR;
3420                                 IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(rxq->reg_idx), psrtype);
3421                         }
3422                         srrctl = ((dev->data->dev_conf.rxmode.split_hdr_size <<
3423                                    IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) &
3424                                   IXGBE_SRRCTL_BSIZEHDR_MASK);
3425                         srrctl |= E1000_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS;
3426                 } else
3427 #endif
3428                         srrctl = IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
3429
3430                 /* Set if packets are dropped when no descriptors available */
3431                 if (rxq->drop_en)
3432                         srrctl |= IXGBE_SRRCTL_DROP_EN;
3433
3434                 /*
3435                  * Configure the RX buffer size in the BSIZEPACKET field of
3436                  * the SRRCTL register of the queue.
3437                  * The value is in 1 KB resolution. Valid values can be from
3438                  * 1 KB to 16 KB.
3439                  */
3440                 mbp_priv = (struct rte_pktmbuf_pool_private *)
3441                         ((char *)rxq->mb_pool + sizeof(struct rte_mempool));
3442                 buf_size = (uint16_t) (mbp_priv->mbuf_data_room_size -
3443                                        RTE_PKTMBUF_HEADROOM);
3444                 srrctl |= ((buf_size >> IXGBE_SRRCTL_BSIZEPKT_SHIFT) &
3445                            IXGBE_SRRCTL_BSIZEPKT_MASK);
3446                 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxq->reg_idx), srrctl);
3447
3448                 buf_size = (uint16_t) ((srrctl & IXGBE_SRRCTL_BSIZEPKT_MASK) <<
3449                                        IXGBE_SRRCTL_BSIZEPKT_SHIFT);
3450
3451                 /* It adds dual VLAN length for supporting dual VLAN */
3452                 if ((dev->data->dev_conf.rxmode.max_rx_pkt_len +
3453                                 2 * IXGBE_VLAN_TAG_SIZE) > buf_size){
3454                         dev->data->scattered_rx = 1;
3455                         dev->rx_pkt_burst = ixgbe_recv_scattered_pkts;
3456                 }
3457         }
3458
3459         /*
3460          * Device configured with multiple RX queues.
3461          */
3462         ixgbe_dev_mq_rx_configure(dev);
3463
3464         /*
3465          * Setup the Checksum Register.
3466          * Disable Full-Packet Checksum which is mutually exclusive with RSS.
3467          * Enable IP/L4 checkum computation by hardware if requested to do so.
3468          */
3469         rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
3470         rxcsum |= IXGBE_RXCSUM_PCSD;
3471         if (dev->data->dev_conf.rxmode.hw_ip_checksum)
3472                 rxcsum |= IXGBE_RXCSUM_IPPCSE;
3473         else
3474                 rxcsum &= ~IXGBE_RXCSUM_IPPCSE;
3475
3476         IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
3477
3478         if (hw->mac.type == ixgbe_mac_82599EB) {
3479                 rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
3480                 if (dev->data->dev_conf.rxmode.hw_strip_crc)
3481                         rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP;
3482                 else
3483                         rdrxctl &= ~IXGBE_RDRXCTL_CRCSTRIP;
3484                 rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE;
3485                 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl);
3486         }
3487         
3488         return 0;
3489 }
3490
3491 /*
3492  * Initializes Transmit Unit.
3493  */
3494 void
3495 ixgbe_dev_tx_init(struct rte_eth_dev *dev)
3496 {
3497         struct ixgbe_hw     *hw;
3498         struct igb_tx_queue *txq;
3499         uint64_t bus_addr;
3500         uint32_t hlreg0;
3501         uint32_t txctrl;
3502         uint16_t i;
3503
3504         PMD_INIT_FUNC_TRACE();
3505         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3506
3507         /* Enable TX CRC (checksum offload requirement) */
3508         hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
3509         hlreg0 |= IXGBE_HLREG0_TXCRCEN;
3510         IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
3511
3512         /* Setup the Base and Length of the Tx Descriptor Rings */
3513         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3514                 txq = dev->data->tx_queues[i];
3515
3516                 bus_addr = txq->tx_ring_phys_addr;
3517                 IXGBE_WRITE_REG(hw, IXGBE_TDBAL(txq->reg_idx),
3518                                 (uint32_t)(bus_addr & 0x00000000ffffffffULL));
3519                 IXGBE_WRITE_REG(hw, IXGBE_TDBAH(txq->reg_idx),
3520                                 (uint32_t)(bus_addr >> 32));
3521                 IXGBE_WRITE_REG(hw, IXGBE_TDLEN(txq->reg_idx),
3522                                 txq->nb_tx_desc * sizeof(union ixgbe_adv_tx_desc));
3523                 /* Setup the HW Tx Head and TX Tail descriptor pointers */
3524                 IXGBE_WRITE_REG(hw, IXGBE_TDH(txq->reg_idx), 0);
3525                 IXGBE_WRITE_REG(hw, IXGBE_TDT(txq->reg_idx), 0);
3526
3527                 /*
3528                  * Disable Tx Head Writeback RO bit, since this hoses
3529                  * bookkeeping if things aren't delivered in order.
3530                  */
3531                 switch (hw->mac.type) {
3532                         case ixgbe_mac_82598EB:
3533                                 txctrl = IXGBE_READ_REG(hw,
3534                                                         IXGBE_DCA_TXCTRL(txq->reg_idx));
3535                                 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
3536                                 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(txq->reg_idx),
3537                                                 txctrl);
3538                                 break;
3539
3540                         case ixgbe_mac_82599EB:
3541                         case ixgbe_mac_X540:
3542                         default:
3543                                 txctrl = IXGBE_READ_REG(hw,
3544                                                 IXGBE_DCA_TXCTRL_82599(txq->reg_idx));
3545                                 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
3546                                 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(txq->reg_idx),
3547                                                 txctrl);
3548                                 break;
3549                 }
3550         }
3551
3552         /* Device configured with multiple TX queues. */
3553         ixgbe_dev_mq_tx_configure(dev);
3554 }
3555
3556 /*
3557  * Start Transmit and Receive Units.
3558  */
3559 void
3560 ixgbe_dev_rxtx_start(struct rte_eth_dev *dev)
3561 {
3562         struct ixgbe_hw     *hw;
3563         struct igb_tx_queue *txq;
3564         struct igb_rx_queue *rxq;
3565         uint32_t txdctl;
3566         uint32_t dmatxctl;
3567         uint32_t rxdctl;
3568         uint32_t rxctrl;
3569         uint16_t i;
3570         int poll_ms;
3571
3572         PMD_INIT_FUNC_TRACE();
3573         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3574
3575         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3576                 txq = dev->data->tx_queues[i];
3577                 /* Setup Transmit Threshold Registers */
3578                 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txq->reg_idx));
3579                 txdctl |= txq->pthresh & 0x7F;
3580                 txdctl |= ((txq->hthresh & 0x7F) << 8);
3581                 txdctl |= ((txq->wthresh & 0x7F) << 16);
3582                 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txq->reg_idx), txdctl);
3583         }
3584
3585         if (hw->mac.type != ixgbe_mac_82598EB) {
3586                 dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
3587                 dmatxctl |= IXGBE_DMATXCTL_TE;
3588                 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
3589         }
3590
3591         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3592                 txq = dev->data->tx_queues[i];
3593                 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txq->reg_idx));
3594                 txdctl |= IXGBE_TXDCTL_ENABLE;
3595                 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txq->reg_idx), txdctl);
3596
3597                 /* Wait until TX Enable ready */
3598                 if (hw->mac.type == ixgbe_mac_82599EB) {
3599                         poll_ms = 10;
3600                         do {
3601                                 rte_delay_ms(1);
3602                                 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txq->reg_idx));
3603                         } while (--poll_ms && !(txdctl & IXGBE_TXDCTL_ENABLE));
3604                         if (!poll_ms)
3605                                 PMD_INIT_LOG(ERR, "Could not enable "
3606                                              "Tx Queue %d\n", i);
3607                 }
3608         }
3609         for (i = 0; i < dev->data->nb_rx_queues; i++) {
3610                 rxq = dev->data->rx_queues[i];
3611                 rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxq->reg_idx));
3612                 rxdctl |= IXGBE_RXDCTL_ENABLE;
3613                 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxq->reg_idx), rxdctl);
3614
3615                 /* Wait until RX Enable ready */
3616                 poll_ms = 10;
3617                 do {
3618                         rte_delay_ms(1);
3619                         rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxq->reg_idx));
3620                 } while (--poll_ms && !(rxdctl & IXGBE_RXDCTL_ENABLE));
3621                 if (!poll_ms)
3622                         PMD_INIT_LOG(ERR, "Could not enable "
3623                                      "Rx Queue %d\n", i);
3624                 rte_wmb();
3625                 IXGBE_WRITE_REG(hw, IXGBE_RDT(rxq->reg_idx), rxq->nb_rx_desc - 1);
3626         }
3627
3628         /* Enable Receive engine */
3629         rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
3630         if (hw->mac.type == ixgbe_mac_82598EB)
3631                 rxctrl |= IXGBE_RXCTRL_DMBYPS;
3632         rxctrl |= IXGBE_RXCTRL_RXEN;
3633         hw->mac.ops.enable_rx_dma(hw, rxctrl);
3634 }
3635
3636
3637 /*
3638  * [VF] Initializes Receive Unit.
3639  */
3640 int
3641 ixgbevf_dev_rx_init(struct rte_eth_dev *dev)
3642 {
3643         struct ixgbe_hw     *hw;
3644         struct igb_rx_queue *rxq;
3645         struct rte_pktmbuf_pool_private *mbp_priv;
3646         uint64_t bus_addr;
3647         uint32_t srrctl;
3648         uint16_t buf_size;
3649         uint16_t i;
3650         int ret;
3651
3652         PMD_INIT_FUNC_TRACE();
3653         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3654
3655         /* Setup RX queues */
3656         dev->rx_pkt_burst = ixgbe_recv_pkts;
3657         for (i = 0; i < dev->data->nb_rx_queues; i++) {
3658                 rxq = dev->data->rx_queues[i];
3659
3660                 /* Allocate buffers for descriptor rings */
3661                 ret = ixgbe_alloc_rx_queue_mbufs(rxq);
3662                 if (ret)
3663                         return ret;
3664
3665                 /* Setup the Base and Length of the Rx Descriptor Rings */
3666                 bus_addr = rxq->rx_ring_phys_addr;
3667
3668                 IXGBE_WRITE_REG(hw, IXGBE_VFRDBAL(i),
3669                                 (uint32_t)(bus_addr & 0x00000000ffffffffULL));
3670                 IXGBE_WRITE_REG(hw, IXGBE_VFRDBAH(i),
3671                                 (uint32_t)(bus_addr >> 32));
3672                 IXGBE_WRITE_REG(hw, IXGBE_VFRDLEN(i),
3673                                 rxq->nb_rx_desc * sizeof(union ixgbe_adv_rx_desc));
3674                 IXGBE_WRITE_REG(hw, IXGBE_VFRDH(i), 0);
3675                 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(i), 0);
3676
3677
3678                 /* Configure the SRRCTL register */
3679 #ifdef RTE_HEADER_SPLIT_ENABLE
3680                 /*
3681                  * Configure Header Split
3682                  */
3683                 if (dev->data->dev_conf.rxmode.header_split) {
3684
3685                         /* Must setup the PSRTYPE register */
3686                         uint32_t psrtype;
3687                         psrtype = IXGBE_PSRTYPE_TCPHDR |
3688                                 IXGBE_PSRTYPE_UDPHDR   |
3689                                 IXGBE_PSRTYPE_IPV4HDR  |
3690                                 IXGBE_PSRTYPE_IPV6HDR;
3691
3692                         IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE(i), psrtype);
3693
3694                         srrctl = ((dev->data->dev_conf.rxmode.split_hdr_size <<
3695                                    IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) &
3696                                   IXGBE_SRRCTL_BSIZEHDR_MASK);
3697                         srrctl |= E1000_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS;
3698                 } else
3699 #endif
3700                         srrctl = IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
3701
3702                 /* Set if packets are dropped when no descriptors available */
3703                 if (rxq->drop_en)
3704                         srrctl |= IXGBE_SRRCTL_DROP_EN;
3705
3706                 /*
3707                  * Configure the RX buffer size in the BSIZEPACKET field of
3708                  * the SRRCTL register of the queue.
3709                  * The value is in 1 KB resolution. Valid values can be from
3710                  * 1 KB to 16 KB.
3711                  */
3712                 mbp_priv = (struct rte_pktmbuf_pool_private *)
3713                         ((char *)rxq->mb_pool + sizeof(struct rte_mempool));
3714                 buf_size = (uint16_t) (mbp_priv->mbuf_data_room_size -
3715                                        RTE_PKTMBUF_HEADROOM);
3716                 srrctl |= ((buf_size >> IXGBE_SRRCTL_BSIZEPKT_SHIFT) &
3717                            IXGBE_SRRCTL_BSIZEPKT_MASK);
3718
3719                 /*
3720                  * VF modification to write virtual function SRRCTL register
3721                  */
3722                 IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(i), srrctl);
3723
3724                 buf_size = (uint16_t) ((srrctl & IXGBE_SRRCTL_BSIZEPKT_MASK) <<
3725                                        IXGBE_SRRCTL_BSIZEPKT_SHIFT);
3726
3727                 /* It adds dual VLAN length for supporting dual VLAN */
3728                 if ((dev->data->dev_conf.rxmode.max_rx_pkt_len +
3729                                 2 * IXGBE_VLAN_TAG_SIZE) > buf_size) {
3730                         dev->data->scattered_rx = 1;
3731                         dev->rx_pkt_burst = ixgbe_recv_scattered_pkts;
3732                 }
3733         }
3734
3735         return 0;
3736 }
3737
3738 /*
3739  * [VF] Initializes Transmit Unit.
3740  */
3741 void
3742 ixgbevf_dev_tx_init(struct rte_eth_dev *dev)
3743 {
3744         struct ixgbe_hw     *hw;
3745         struct igb_tx_queue *txq;
3746         uint64_t bus_addr;
3747         uint32_t txctrl;
3748         uint16_t i;
3749
3750         PMD_INIT_FUNC_TRACE();
3751         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3752
3753         /* Setup the Base and Length of the Tx Descriptor Rings */
3754         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3755                 txq = dev->data->tx_queues[i];
3756                 bus_addr = txq->tx_ring_phys_addr;
3757                 IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(i),
3758                                 (uint32_t)(bus_addr & 0x00000000ffffffffULL));
3759                 IXGBE_WRITE_REG(hw, IXGBE_VFTDBAH(i),
3760                                 (uint32_t)(bus_addr >> 32));
3761                 IXGBE_WRITE_REG(hw, IXGBE_VFTDLEN(i),
3762                                 txq->nb_tx_desc * sizeof(union ixgbe_adv_tx_desc));
3763                 /* Setup the HW Tx Head and TX Tail descriptor pointers */
3764                 IXGBE_WRITE_REG(hw, IXGBE_VFTDH(i), 0);
3765                 IXGBE_WRITE_REG(hw, IXGBE_VFTDT(i), 0);
3766
3767                 /*
3768                  * Disable Tx Head Writeback RO bit, since this hoses
3769                  * bookkeeping if things aren't delivered in order.
3770                  */
3771                 txctrl = IXGBE_READ_REG(hw,
3772                                 IXGBE_VFDCA_TXCTRL(i));
3773                 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
3774                 IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(i),
3775                                 txctrl);
3776         }
3777 }
3778
3779 /*
3780  * [VF] Start Transmit and Receive Units.
3781  */
3782 void
3783 ixgbevf_dev_rxtx_start(struct rte_eth_dev *dev)
3784 {
3785         struct ixgbe_hw     *hw;
3786         struct igb_tx_queue *txq;
3787         struct igb_rx_queue *rxq;
3788         uint32_t txdctl;
3789         uint32_t rxdctl;
3790         uint16_t i;
3791         int poll_ms;
3792
3793         PMD_INIT_FUNC_TRACE();
3794         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3795
3796         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3797                 txq = dev->data->tx_queues[i];
3798                 /* Setup Transmit Threshold Registers */
3799                 txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
3800                 txdctl |= txq->pthresh & 0x7F;
3801                 txdctl |= ((txq->hthresh & 0x7F) << 8);
3802                 txdctl |= ((txq->wthresh & 0x7F) << 16);
3803                 IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl);
3804         }
3805
3806         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3807
3808                 txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
3809                 txdctl |= IXGBE_TXDCTL_ENABLE;
3810                 IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl);
3811
3812                 poll_ms = 10;
3813                 /* Wait until TX Enable ready */
3814                 do {
3815                         rte_delay_ms(1);
3816                         txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
3817                 } while (--poll_ms && !(txdctl & IXGBE_TXDCTL_ENABLE));
3818                 if (!poll_ms)
3819                         PMD_INIT_LOG(ERR, "Could not enable "
3820                                          "Tx Queue %d\n", i);
3821         }
3822         for (i = 0; i < dev->data->nb_rx_queues; i++) {
3823
3824                 rxq = dev->data->rx_queues[i];
3825
3826                 rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
3827                 rxdctl |= IXGBE_RXDCTL_ENABLE;
3828                 IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), rxdctl);
3829
3830                 /* Wait until RX Enable ready */
3831                 poll_ms = 10;
3832                 do {
3833                         rte_delay_ms(1);
3834                         rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
3835                 } while (--poll_ms && !(rxdctl & IXGBE_RXDCTL_ENABLE));
3836                 if (!poll_ms)
3837                         PMD_INIT_LOG(ERR, "Could not enable "
3838                                          "Rx Queue %d\n", i);
3839                 rte_wmb();
3840                 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(i), rxq->nb_rx_desc - 1);
3841
3842         }
3843 }