doc: whitespace changes in licenses
[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, i;
1802
1803         /* Zero out HW ring memory */
1804         for (i = 0; i < sizeof(union ixgbe_adv_tx_desc) * txq->nb_tx_desc; i++) {
1805                 ((volatile char *)txq->tx_ring)[i] = 0;
1806         }
1807
1808         /* Initialize SW ring entries */
1809         prev = (uint16_t) (txq->nb_tx_desc - 1);
1810         for (i = 0; i < txq->nb_tx_desc; i++) {
1811                 volatile union ixgbe_adv_tx_desc *txd = &txq->tx_ring[i];
1812                 txd->wb.status = IXGBE_TXD_STAT_DD;
1813                 txe[i].mbuf = NULL;
1814                 txe[i].last_id = i;
1815                 txe[prev].next_id = i;
1816                 prev = i;
1817         }
1818
1819         txq->tx_next_dd = (uint16_t)(txq->tx_rs_thresh - 1);
1820         txq->tx_next_rs = (uint16_t)(txq->tx_rs_thresh - 1);
1821
1822         txq->tx_tail = 0;
1823         txq->nb_tx_used = 0;
1824         /*
1825          * Always allow 1 descriptor to be un-allocated to avoid
1826          * a H/W race condition
1827          */
1828         txq->last_desc_cleaned = (uint16_t)(txq->nb_tx_desc - 1);
1829         txq->nb_tx_free = (uint16_t)(txq->nb_tx_desc - 1);
1830         txq->ctx_curr = 0;
1831         memset((void*)&txq->ctx_cache, 0,
1832                 IXGBE_CTX_NUM * sizeof(struct ixgbe_advctx_info));
1833 }
1834
1835 int
1836 ixgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
1837                          uint16_t queue_idx,
1838                          uint16_t nb_desc,
1839                          unsigned int socket_id,
1840                          const struct rte_eth_txconf *tx_conf)
1841 {
1842         const struct rte_memzone *tz;
1843         struct igb_tx_queue *txq;
1844         struct ixgbe_hw     *hw;
1845         uint16_t tx_rs_thresh, tx_free_thresh;
1846
1847         PMD_INIT_FUNC_TRACE();
1848         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1849
1850         /*
1851          * Validate number of transmit descriptors.
1852          * It must not exceed hardware maximum, and must be multiple
1853          * of IXGBE_ALIGN.
1854          */
1855         if (((nb_desc * sizeof(union ixgbe_adv_tx_desc)) % IXGBE_ALIGN) != 0 ||
1856             (nb_desc > IXGBE_MAX_RING_DESC) ||
1857             (nb_desc < IXGBE_MIN_RING_DESC)) {
1858                 return -EINVAL;
1859         }
1860
1861         /*
1862          * The following two parameters control the setting of the RS bit on
1863          * transmit descriptors.
1864          * TX descriptors will have their RS bit set after txq->tx_rs_thresh
1865          * descriptors have been used.
1866          * The TX descriptor ring will be cleaned after txq->tx_free_thresh
1867          * descriptors are used or if the number of descriptors required
1868          * to transmit a packet is greater than the number of free TX
1869          * descriptors.
1870          * The following constraints must be satisfied:
1871          *  tx_rs_thresh must be greater than 0.
1872          *  tx_rs_thresh must be less than the size of the ring minus 2.
1873          *  tx_rs_thresh must be less than or equal to tx_free_thresh.
1874          *  tx_rs_thresh must be a divisor of the ring size.
1875          *  tx_free_thresh must be greater than 0.
1876          *  tx_free_thresh must be less than the size of the ring minus 3.
1877          * One descriptor in the TX ring is used as a sentinel to avoid a
1878          * H/W race condition, hence the maximum threshold constraints.
1879          * When set to zero use default values.
1880          */
1881         tx_rs_thresh = (uint16_t)((tx_conf->tx_rs_thresh) ?
1882                         tx_conf->tx_rs_thresh : DEFAULT_TX_RS_THRESH);
1883         tx_free_thresh = (uint16_t)((tx_conf->tx_free_thresh) ?
1884                         tx_conf->tx_free_thresh : DEFAULT_TX_FREE_THRESH);
1885         if (tx_rs_thresh >= (nb_desc - 2)) {
1886                 RTE_LOG(ERR, PMD, "tx_rs_thresh must be less than the number "
1887                         "of TX descriptors minus 2. (tx_rs_thresh=%u port=%d "
1888                                 "queue=%d)\n", (unsigned int)tx_rs_thresh,
1889                                 (int)dev->data->port_id, (int)queue_idx);
1890                 return -(EINVAL);
1891         }
1892         if (tx_free_thresh >= (nb_desc - 3)) {
1893                 RTE_LOG(ERR, PMD, "tx_rs_thresh must be less than the "
1894                         "tx_free_thresh must be less than the number of TX "
1895                         "descriptors minus 3. (tx_free_thresh=%u port=%d "
1896                                 "queue=%d)\n", (unsigned int)tx_free_thresh,
1897                                 (int)dev->data->port_id, (int)queue_idx);
1898                 return -(EINVAL);
1899         }
1900         if (tx_rs_thresh > tx_free_thresh) {
1901                 RTE_LOG(ERR, PMD, "tx_rs_thresh must be less than or equal to "
1902                         "tx_free_thresh. (tx_free_thresh=%u tx_rs_thresh=%u "
1903                         "port=%d queue=%d)\n", (unsigned int)tx_free_thresh,
1904                         (unsigned int)tx_rs_thresh, (int)dev->data->port_id,
1905                                                         (int)queue_idx);
1906                 return -(EINVAL);
1907         }
1908         if ((nb_desc % tx_rs_thresh) != 0) {
1909                 RTE_LOG(ERR, PMD, "tx_rs_thresh must be a divisor of the "
1910                         "number of TX descriptors. (tx_rs_thresh=%u port=%d "
1911                                 "queue=%d)\n", (unsigned int)tx_rs_thresh,
1912                                 (int)dev->data->port_id, (int)queue_idx);
1913                 return -(EINVAL);
1914         }
1915
1916         /*
1917          * If rs_bit_thresh is greater than 1, then TX WTHRESH should be
1918          * set to 0. If WTHRESH is greater than zero, the RS bit is ignored
1919          * by the NIC and all descriptors are written back after the NIC
1920          * accumulates WTHRESH descriptors.
1921          */
1922         if ((tx_rs_thresh > 1) && (tx_conf->tx_thresh.wthresh != 0)) {
1923                 RTE_LOG(ERR, PMD, "TX WTHRESH must be set to 0 if "
1924                         "tx_rs_thresh is greater than 1. (tx_rs_thresh=%u "
1925                         "port=%d queue=%d)\n", (unsigned int)tx_rs_thresh,
1926                                 (int)dev->data->port_id, (int)queue_idx);
1927                 return -(EINVAL);
1928         }
1929
1930         /* Free memory prior to re-allocation if needed... */
1931         if (dev->data->tx_queues[queue_idx] != NULL)
1932                 ixgbe_tx_queue_release(dev->data->tx_queues[queue_idx]);
1933
1934         /* First allocate the tx queue data structure */
1935         txq = rte_zmalloc_socket("ethdev TX queue", sizeof(struct igb_tx_queue),
1936                                  CACHE_LINE_SIZE, socket_id);
1937         if (txq == NULL)
1938                 return (-ENOMEM);
1939
1940         /*
1941          * Allocate TX ring hardware descriptors. A memzone large enough to
1942          * handle the maximum ring size is allocated in order to allow for
1943          * resizing in later calls to the queue setup function.
1944          */
1945         tz = ring_dma_zone_reserve(dev, "tx_ring", queue_idx,
1946                         sizeof(union ixgbe_adv_tx_desc) * IXGBE_MAX_RING_DESC,
1947                         socket_id);
1948         if (tz == NULL) {
1949                 ixgbe_tx_queue_release(txq);
1950                 return (-ENOMEM);
1951         }
1952
1953         txq->nb_tx_desc = nb_desc;
1954         txq->tx_rs_thresh = tx_rs_thresh;
1955         txq->tx_free_thresh = tx_free_thresh;
1956         txq->pthresh = tx_conf->tx_thresh.pthresh;
1957         txq->hthresh = tx_conf->tx_thresh.hthresh;
1958         txq->wthresh = tx_conf->tx_thresh.wthresh;
1959         txq->queue_id = queue_idx;
1960         txq->reg_idx = (uint16_t)((RTE_ETH_DEV_SRIOV(dev).active == 0) ? 
1961                 queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx);
1962         txq->port_id = dev->data->port_id;
1963         txq->txq_flags = tx_conf->txq_flags;
1964
1965         /*
1966          * Modification to set VFTDT for virtual function if vf is detected
1967          */
1968         if (hw->mac.type == ixgbe_mac_82599_vf)
1969                 txq->tdt_reg_addr = IXGBE_PCI_REG_ADDR(hw, IXGBE_VFTDT(queue_idx));
1970         else
1971                 txq->tdt_reg_addr = IXGBE_PCI_REG_ADDR(hw, IXGBE_TDT(txq->reg_idx));
1972
1973         txq->tx_ring_phys_addr = (uint64_t) tz->phys_addr;
1974         txq->tx_ring = (union ixgbe_adv_tx_desc *) tz->addr;
1975
1976         /* Allocate software ring */
1977         txq->sw_ring = rte_zmalloc_socket("txq->sw_ring",
1978                                    sizeof(struct igb_tx_entry) * nb_desc,
1979                                    CACHE_LINE_SIZE, socket_id);
1980         if (txq->sw_ring == NULL) {
1981                 ixgbe_tx_queue_release(txq);
1982                 return (-ENOMEM);
1983         }
1984         PMD_INIT_LOG(DEBUG, "sw_ring=%p hw_ring=%p dma_addr=0x%"PRIx64"\n",
1985                      txq->sw_ring, txq->tx_ring, txq->tx_ring_phys_addr);
1986
1987         ixgbe_reset_tx_queue(txq);
1988
1989         dev->data->tx_queues[queue_idx] = txq;
1990
1991         /* Use a simple Tx queue (no offloads, no multi segs) if possible */
1992         if (((txq->txq_flags & IXGBE_SIMPLE_FLAGS) == IXGBE_SIMPLE_FLAGS) &&
1993             (txq->tx_rs_thresh >= RTE_PMD_IXGBE_TX_MAX_BURST)) {
1994                 PMD_INIT_LOG(INFO, "Using simple tx code path\n");
1995                 dev->tx_pkt_burst = ixgbe_xmit_pkts_simple;
1996         } else {
1997                 PMD_INIT_LOG(INFO, "Using full-featured tx code path\n");
1998                 PMD_INIT_LOG(INFO, " - txq_flags = %lx [IXGBE_SIMPLE_FLAGS=%lx]\n", (long unsigned)txq->txq_flags, (long unsigned)IXGBE_SIMPLE_FLAGS);
1999                 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);
2000                 dev->tx_pkt_burst = ixgbe_xmit_pkts;
2001         }
2002
2003         return (0);
2004 }
2005
2006 static void
2007 ixgbe_rx_queue_release_mbufs(struct igb_rx_queue *rxq)
2008 {
2009         unsigned i;
2010
2011         if (rxq->sw_ring != NULL) {
2012                 for (i = 0; i < rxq->nb_rx_desc; i++) {
2013                         if (rxq->sw_ring[i].mbuf != NULL) {
2014                                 rte_pktmbuf_free_seg(rxq->sw_ring[i].mbuf);
2015                                 rxq->sw_ring[i].mbuf = NULL;
2016                         }
2017                 }
2018 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2019                 if (rxq->rx_nb_avail) {
2020                         for (i = 0; i < rxq->rx_nb_avail; ++i) {
2021                                 struct rte_mbuf *mb;
2022                                 mb = rxq->rx_stage[rxq->rx_next_avail + i];
2023                                 rte_pktmbuf_free_seg(mb);
2024                         }
2025                         rxq->rx_nb_avail = 0;
2026                 }
2027 #endif
2028         }
2029 }
2030
2031 static void
2032 ixgbe_rx_queue_release(struct igb_rx_queue *rxq)
2033 {
2034         if (rxq != NULL) {
2035                 ixgbe_rx_queue_release_mbufs(rxq);
2036                 rte_free(rxq->sw_ring);
2037                 rte_free(rxq);
2038         }
2039 }
2040
2041 void
2042 ixgbe_dev_rx_queue_release(void *rxq)
2043 {
2044         ixgbe_rx_queue_release(rxq);
2045 }
2046
2047 /*
2048  * Check if Rx Burst Bulk Alloc function can be used.
2049  * Return
2050  *        0: the preconditions are satisfied and the bulk allocation function
2051  *           can be used.
2052  *  -EINVAL: the preconditions are NOT satisfied and the default Rx burst
2053  *           function must be used.
2054  */
2055 static inline int
2056 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2057 check_rx_burst_bulk_alloc_preconditions(struct igb_rx_queue *rxq)
2058 #else
2059 check_rx_burst_bulk_alloc_preconditions(__rte_unused struct igb_rx_queue *rxq)
2060 #endif
2061 {
2062         int ret = 0;
2063
2064         /*
2065          * Make sure the following pre-conditions are satisfied:
2066          *   rxq->rx_free_thresh >= RTE_PMD_IXGBE_RX_MAX_BURST
2067          *   rxq->rx_free_thresh < rxq->nb_rx_desc
2068          *   (rxq->nb_rx_desc % rxq->rx_free_thresh) == 0
2069          *   rxq->nb_rx_desc<(IXGBE_MAX_RING_DESC-RTE_PMD_IXGBE_RX_MAX_BURST)
2070          * Scattered packets are not supported.  This should be checked
2071          * outside of this function.
2072          */
2073 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2074         if (! (rxq->rx_free_thresh >= RTE_PMD_IXGBE_RX_MAX_BURST))
2075                 ret = -EINVAL;
2076         else if (! (rxq->rx_free_thresh < rxq->nb_rx_desc))
2077                 ret = -EINVAL;
2078         else if (! ((rxq->nb_rx_desc % rxq->rx_free_thresh) == 0))
2079                 ret = -EINVAL;
2080         else if (! (rxq->nb_rx_desc <
2081                (IXGBE_MAX_RING_DESC - RTE_PMD_IXGBE_RX_MAX_BURST)))
2082                 ret = -EINVAL;
2083 #else
2084         ret = -EINVAL;
2085 #endif
2086
2087         return ret;
2088 }
2089
2090 /* Reset dynamic igb_rx_queue fields back to defaults */
2091 static void
2092 ixgbe_reset_rx_queue(struct igb_rx_queue *rxq)
2093 {
2094         unsigned i;
2095         uint16_t len;
2096
2097         /*
2098          * By default, the Rx queue setup function allocates enough memory for
2099          * IXGBE_MAX_RING_DESC.  The Rx Burst bulk allocation function requires
2100          * extra memory at the end of the descriptor ring to be zero'd out. A
2101          * pre-condition for using the Rx burst bulk alloc function is that the
2102          * number of descriptors is less than or equal to
2103          * (IXGBE_MAX_RING_DESC - RTE_PMD_IXGBE_RX_MAX_BURST). Check all the
2104          * constraints here to see if we need to zero out memory after the end
2105          * of the H/W descriptor ring.
2106          */
2107 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2108         if (check_rx_burst_bulk_alloc_preconditions(rxq) == 0)
2109                 /* zero out extra memory */
2110                 len = (uint16_t)(rxq->nb_rx_desc + RTE_PMD_IXGBE_RX_MAX_BURST);
2111         else
2112 #endif
2113                 /* do not zero out extra memory */
2114                 len = rxq->nb_rx_desc;
2115
2116         /*
2117          * Zero out HW ring memory. Zero out extra memory at the end of
2118          * the H/W ring so look-ahead logic in Rx Burst bulk alloc function
2119          * reads extra memory as zeros.
2120          */
2121         for (i = 0; i < len * sizeof(union ixgbe_adv_rx_desc); i++) {
2122                 ((volatile char *)rxq->rx_ring)[i] = 0;
2123         }
2124
2125 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2126         /*
2127          * initialize extra software ring entries. Space for these extra
2128          * entries is always allocated
2129          */
2130         memset(&rxq->fake_mbuf, 0x0, sizeof(rxq->fake_mbuf));
2131         for (i = 0; i < RTE_PMD_IXGBE_RX_MAX_BURST; ++i) {
2132                 rxq->sw_ring[rxq->nb_rx_desc + i].mbuf = &rxq->fake_mbuf;
2133         }
2134
2135         rxq->rx_nb_avail = 0;
2136         rxq->rx_next_avail = 0;
2137         rxq->rx_free_trigger = (uint16_t)(rxq->rx_free_thresh - 1);
2138 #endif /* RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC */
2139         rxq->rx_tail = 0;
2140         rxq->nb_rx_hold = 0;
2141         rxq->pkt_first_seg = NULL;
2142         rxq->pkt_last_seg = NULL;
2143 }
2144
2145 int
2146 ixgbe_dev_rx_queue_setup(struct rte_eth_dev *dev,
2147                          uint16_t queue_idx,
2148                          uint16_t nb_desc,
2149                          unsigned int socket_id,
2150                          const struct rte_eth_rxconf *rx_conf,
2151                          struct rte_mempool *mp)
2152 {
2153         const struct rte_memzone *rz;
2154         struct igb_rx_queue *rxq;
2155         struct ixgbe_hw     *hw;
2156         int use_def_burst_func = 1;
2157         uint16_t len;
2158
2159         PMD_INIT_FUNC_TRACE();
2160         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2161
2162         /*
2163          * Validate number of receive descriptors.
2164          * It must not exceed hardware maximum, and must be multiple
2165          * of IXGBE_ALIGN.
2166          */
2167         if (((nb_desc * sizeof(union ixgbe_adv_rx_desc)) % IXGBE_ALIGN) != 0 ||
2168             (nb_desc > IXGBE_MAX_RING_DESC) ||
2169             (nb_desc < IXGBE_MIN_RING_DESC)) {
2170                 return (-EINVAL);
2171         }
2172
2173         /* Free memory prior to re-allocation if needed... */
2174         if (dev->data->rx_queues[queue_idx] != NULL)
2175                 ixgbe_rx_queue_release(dev->data->rx_queues[queue_idx]);
2176
2177         /* First allocate the rx queue data structure */
2178         rxq = rte_zmalloc_socket("ethdev RX queue", sizeof(struct igb_rx_queue),
2179                                  CACHE_LINE_SIZE, socket_id);
2180         if (rxq == NULL)
2181                 return (-ENOMEM);
2182         rxq->mb_pool = mp;
2183         rxq->nb_rx_desc = nb_desc;
2184         rxq->rx_free_thresh = rx_conf->rx_free_thresh;
2185         rxq->queue_id = queue_idx;
2186         rxq->reg_idx = (uint16_t)((RTE_ETH_DEV_SRIOV(dev).active == 0) ? 
2187                 queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx);
2188         rxq->port_id = dev->data->port_id;
2189         rxq->crc_len = (uint8_t) ((dev->data->dev_conf.rxmode.hw_strip_crc) ?
2190                                                         0 : ETHER_CRC_LEN);
2191         rxq->drop_en = rx_conf->rx_drop_en;
2192
2193         /*
2194          * Allocate RX ring hardware descriptors. A memzone large enough to
2195          * handle the maximum ring size is allocated in order to allow for
2196          * resizing in later calls to the queue setup function.
2197          */
2198         rz = ring_dma_zone_reserve(dev, "rx_ring", queue_idx,
2199                         IXGBE_MAX_RING_DESC * sizeof(union ixgbe_adv_rx_desc),
2200                         socket_id);
2201         if (rz == NULL) {
2202                 ixgbe_rx_queue_release(rxq);
2203                 return (-ENOMEM);
2204         }
2205         /*
2206          * Modified to setup VFRDT for Virtual Function
2207          */
2208         if (hw->mac.type == ixgbe_mac_82599_vf) {
2209                 rxq->rdt_reg_addr =
2210                         IXGBE_PCI_REG_ADDR(hw, IXGBE_VFRDT(queue_idx));
2211                 rxq->rdh_reg_addr =
2212                         IXGBE_PCI_REG_ADDR(hw, IXGBE_VFRDH(queue_idx));
2213         }
2214         else {
2215                 rxq->rdt_reg_addr =
2216                         IXGBE_PCI_REG_ADDR(hw, IXGBE_RDT(rxq->reg_idx));
2217                 rxq->rdh_reg_addr =
2218                         IXGBE_PCI_REG_ADDR(hw, IXGBE_RDH(rxq->reg_idx));
2219         }
2220
2221         rxq->rx_ring_phys_addr = (uint64_t) rz->phys_addr;
2222         rxq->rx_ring = (union ixgbe_adv_rx_desc *) rz->addr;
2223
2224         /*
2225          * Allocate software ring. Allow for space at the end of the 
2226          * S/W ring to make sure look-ahead logic in bulk alloc Rx burst
2227          * function does not access an invalid memory region.
2228          */
2229 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2230         len = (uint16_t)(nb_desc + RTE_PMD_IXGBE_RX_MAX_BURST);
2231 #else
2232         len = nb_desc;
2233 #endif
2234         rxq->sw_ring = rte_zmalloc_socket("rxq->sw_ring",
2235                                           sizeof(struct igb_rx_entry) * len,
2236                                           CACHE_LINE_SIZE, socket_id);
2237         if (rxq->sw_ring == NULL) {
2238                 ixgbe_rx_queue_release(rxq);
2239                 return (-ENOMEM);
2240         }
2241         PMD_INIT_LOG(DEBUG, "sw_ring=%p hw_ring=%p dma_addr=0x%"PRIx64"\n",
2242                      rxq->sw_ring, rxq->rx_ring, rxq->rx_ring_phys_addr);
2243
2244         /*
2245          * Certain constaints must be met in order to use the bulk buffer
2246          * allocation Rx burst function.
2247          */
2248         use_def_burst_func = check_rx_burst_bulk_alloc_preconditions(rxq);
2249
2250         /* Check if pre-conditions are satisfied, and no Scattered Rx */
2251         if (!use_def_burst_func && !dev->data->scattered_rx) {
2252 #ifdef RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC
2253                 PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions are "
2254                              "satisfied. Rx Burst Bulk Alloc function will be "
2255                              "used on port=%d, queue=%d.\n",
2256                              rxq->port_id, rxq->queue_id);
2257                 dev->rx_pkt_burst = ixgbe_recv_pkts_bulk_alloc;
2258 #endif
2259         } else {
2260                 PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions "
2261                              "are not satisfied, Scattered Rx is requested, "
2262                              "or RTE_LIBRTE_IXGBE_RX_ALLOW_BULK_ALLOC is not "
2263                              "enabled (port=%d, queue=%d).\n",
2264                              rxq->port_id, rxq->queue_id);
2265         }
2266         dev->data->rx_queues[queue_idx] = rxq;
2267
2268         ixgbe_reset_rx_queue(rxq);
2269
2270         return 0;
2271 }
2272
2273 uint32_t
2274 ixgbe_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
2275 {
2276 #define IXGBE_RXQ_SCAN_INTERVAL 4
2277         volatile union ixgbe_adv_rx_desc *rxdp;
2278         struct igb_rx_queue *rxq;
2279         uint32_t desc = 0;
2280
2281         if (rx_queue_id >= dev->data->nb_rx_queues) {
2282                 PMD_RX_LOG(ERR, "Invalid RX queue id=%d\n", rx_queue_id);
2283                 return 0;
2284         }
2285
2286         rxq = dev->data->rx_queues[rx_queue_id];
2287         rxdp = &(rxq->rx_ring[rxq->rx_tail]);
2288
2289         while ((desc < rxq->nb_rx_desc) &&
2290                 (rxdp->wb.upper.status_error & IXGBE_RXDADV_STAT_DD)) {
2291                 desc += IXGBE_RXQ_SCAN_INTERVAL;
2292                 rxdp += IXGBE_RXQ_SCAN_INTERVAL;
2293                 if (rxq->rx_tail + desc >= rxq->nb_rx_desc)
2294                         rxdp = &(rxq->rx_ring[rxq->rx_tail +
2295                                 desc - rxq->nb_rx_desc]);
2296         }
2297
2298         return desc;
2299 }
2300
2301 int
2302 ixgbe_dev_rx_descriptor_done(void *rx_queue, uint16_t offset)
2303 {
2304         volatile union ixgbe_adv_rx_desc *rxdp;
2305         struct igb_rx_queue *rxq = rx_queue;
2306         uint32_t desc;
2307
2308         if (unlikely(offset >= rxq->nb_rx_desc))
2309                 return 0;
2310         desc = rxq->rx_tail + offset;
2311         if (desc >= rxq->nb_rx_desc)
2312                 desc -= rxq->nb_rx_desc;
2313
2314         rxdp = &rxq->rx_ring[desc];
2315         return !!(rxdp->wb.upper.status_error & IXGBE_RXDADV_STAT_DD);
2316 }
2317
2318 void
2319 ixgbe_dev_clear_queues(struct rte_eth_dev *dev)
2320 {
2321         unsigned i;
2322
2323         PMD_INIT_FUNC_TRACE();
2324
2325         for (i = 0; i < dev->data->nb_tx_queues; i++) {
2326                 struct igb_tx_queue *txq = dev->data->tx_queues[i];
2327                 if (txq != NULL) {
2328                         ixgbe_tx_queue_release_mbufs(txq);
2329                         ixgbe_reset_tx_queue(txq);
2330                 }
2331         }
2332
2333         for (i = 0; i < dev->data->nb_rx_queues; i++) {
2334                 struct igb_rx_queue *rxq = dev->data->rx_queues[i];
2335                 if (rxq != NULL) {
2336                         ixgbe_rx_queue_release_mbufs(rxq);
2337                         ixgbe_reset_rx_queue(rxq);
2338                 }
2339         }
2340 }
2341
2342 /*********************************************************************
2343  *
2344  *  Device RX/TX init functions
2345  *
2346  **********************************************************************/
2347
2348 /**
2349  * Receive Side Scaling (RSS)
2350  * See section 7.1.2.8 in the following document:
2351  *     "Intel 82599 10 GbE Controller Datasheet" - Revision 2.1 October 2009
2352  *
2353  * Principles:
2354  * The source and destination IP addresses of the IP header and the source
2355  * and destination ports of TCP/UDP headers, if any, of received packets are
2356  * hashed against a configurable random key to compute a 32-bit RSS hash result.
2357  * The seven (7) LSBs of the 32-bit hash result are used as an index into a
2358  * 128-entry redirection table (RETA).  Each entry of the RETA provides a 3-bit
2359  * RSS output index which is used as the RX queue index where to store the
2360  * received packets.
2361  * The following output is supplied in the RX write-back descriptor:
2362  *     - 32-bit result of the Microsoft RSS hash function,
2363  *     - 4-bit RSS type field.
2364  */
2365
2366 /*
2367  * RSS random key supplied in section 7.1.2.8.3 of the Intel 82599 datasheet.
2368  * Used as the default key.
2369  */
2370 static uint8_t rss_intel_key[40] = {
2371         0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2,
2372         0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0,
2373         0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,
2374         0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C,
2375         0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA,
2376 };
2377
2378 static void
2379 ixgbe_rss_disable(struct rte_eth_dev *dev)
2380 {
2381         struct ixgbe_hw *hw;
2382         uint32_t mrqc;
2383
2384         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2385         mrqc = IXGBE_READ_REG(hw, IXGBE_MRQC);
2386         mrqc &= ~IXGBE_MRQC_RSSEN;
2387         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
2388 }
2389
2390 static void
2391 ixgbe_rss_configure(struct rte_eth_dev *dev)
2392 {
2393         struct ixgbe_hw *hw;
2394         uint8_t *hash_key;
2395         uint32_t rss_key;
2396         uint32_t mrqc;
2397         uint32_t reta;
2398         uint16_t rss_hf;
2399         uint16_t i;
2400         uint16_t j;
2401
2402         PMD_INIT_FUNC_TRACE();
2403         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2404
2405         rss_hf = dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf;
2406         if (rss_hf == 0) { /* Disable RSS */
2407                 ixgbe_rss_disable(dev);
2408                 return;
2409         }
2410         hash_key = dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key;
2411         if (hash_key == NULL)
2412                 hash_key = rss_intel_key; /* Default hash key */
2413
2414         /* Fill in RSS hash key */
2415         for (i = 0; i < 10; i++) {
2416                 rss_key  = hash_key[(i * 4)];
2417                 rss_key |= hash_key[(i * 4) + 1] << 8;
2418                 rss_key |= hash_key[(i * 4) + 2] << 16;
2419                 rss_key |= hash_key[(i * 4) + 3] << 24;
2420                 IXGBE_WRITE_REG_ARRAY(hw, IXGBE_RSSRK(0), i, rss_key);
2421         }
2422
2423         /* Fill in redirection table */
2424         reta = 0;
2425         for (i = 0, j = 0; i < 128; i++, j++) {
2426                 if (j == dev->data->nb_rx_queues) j = 0;
2427                 reta = (reta << 8) | j;
2428                 if ((i & 3) == 3)
2429                         IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), rte_bswap32(reta));
2430         }
2431
2432         /* Set configured hashing functions in MRQC register */
2433         mrqc = IXGBE_MRQC_RSSEN; /* RSS enable */
2434         if (rss_hf & ETH_RSS_IPV4)
2435                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
2436         if (rss_hf & ETH_RSS_IPV4_TCP)
2437                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
2438         if (rss_hf & ETH_RSS_IPV6)
2439                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
2440         if (rss_hf & ETH_RSS_IPV6_EX)
2441                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
2442         if (rss_hf & ETH_RSS_IPV6_TCP)
2443                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
2444         if (rss_hf & ETH_RSS_IPV6_TCP_EX)
2445                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
2446         if (rss_hf & ETH_RSS_IPV4_UDP)
2447                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
2448         if (rss_hf & ETH_RSS_IPV6_UDP)
2449                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
2450         if (rss_hf & ETH_RSS_IPV6_UDP_EX)
2451                 mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
2452         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
2453 }
2454
2455 #define NUM_VFTA_REGISTERS 128
2456 #define NIC_RX_BUFFER_SIZE 0x200
2457
2458 static void
2459 ixgbe_vmdq_dcb_configure(struct rte_eth_dev *dev)
2460 {
2461         struct rte_eth_vmdq_dcb_conf *cfg;
2462         struct ixgbe_hw *hw;
2463         enum rte_eth_nb_pools num_pools;
2464         uint32_t mrqc, vt_ctl, queue_mapping, vlanctrl;
2465         uint16_t pbsize;
2466         uint8_t nb_tcs; /* number of traffic classes */
2467         int i;
2468
2469         PMD_INIT_FUNC_TRACE();
2470         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2471         cfg = &dev->data->dev_conf.rx_adv_conf.vmdq_dcb_conf;
2472         num_pools = cfg->nb_queue_pools;
2473         /* Check we have a valid number of pools */
2474         if (num_pools != ETH_16_POOLS && num_pools != ETH_32_POOLS) {
2475                 ixgbe_rss_disable(dev);
2476                 return;
2477         }
2478         /* 16 pools -> 8 traffic classes, 32 pools -> 4 traffic classes */
2479         nb_tcs = (uint8_t)(ETH_VMDQ_DCB_NUM_QUEUES / (int)num_pools);
2480
2481         /*
2482          * RXPBSIZE
2483          * split rx buffer up into sections, each for 1 traffic class
2484          */
2485         pbsize = (uint16_t)(NIC_RX_BUFFER_SIZE / nb_tcs);
2486         for (i = 0 ; i < nb_tcs; i++) {
2487                 uint32_t rxpbsize = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i));
2488                 rxpbsize &= (~(0x3FF << IXGBE_RXPBSIZE_SHIFT));
2489                 /* clear 10 bits. */
2490                 rxpbsize |= (pbsize << IXGBE_RXPBSIZE_SHIFT); /* set value */
2491                 IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpbsize);
2492         }
2493         /* zero alloc all unused TCs */
2494         for (i = nb_tcs; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2495                 uint32_t rxpbsize = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i));
2496                 rxpbsize &= (~( 0x3FF << IXGBE_RXPBSIZE_SHIFT ));
2497                 /* clear 10 bits. */
2498                 IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpbsize);
2499         }
2500
2501         /* MRQC: enable vmdq and dcb */
2502         mrqc = ((num_pools == ETH_16_POOLS) ? \
2503                 IXGBE_MRQC_VMDQRT8TCEN : IXGBE_MRQC_VMDQRT4TCEN );
2504         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
2505
2506         /* PFVTCTL: turn on virtualisation and set the default pool */
2507         vt_ctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
2508         if (cfg->enable_default_pool) {
2509                 vt_ctl |= (cfg->default_pool << IXGBE_VT_CTL_POOL_SHIFT);
2510         } else {
2511                 vt_ctl |= IXGBE_VT_CTL_DIS_DEFPL;
2512         }
2513
2514         IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vt_ctl);
2515
2516         /* RTRUP2TC: mapping user priorities to traffic classes (TCs) */
2517         queue_mapping = 0;
2518         for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++)
2519                 /*
2520                  * mapping is done with 3 bits per priority,
2521                  * so shift by i*3 each time
2522                  */
2523                 queue_mapping |= ((cfg->dcb_queue[i] & 0x07) << (i * 3));
2524
2525         IXGBE_WRITE_REG(hw, IXGBE_RTRUP2TC, queue_mapping);
2526
2527         /* RTRPCS: DCB related */
2528         IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, IXGBE_RMCS_RRM);
2529
2530         /* VLNCTRL: enable vlan filtering and allow all vlan tags through */
2531         vlanctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
2532         vlanctrl |= IXGBE_VLNCTRL_VFE ; /* enable vlan filters */
2533         IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlanctrl);
2534
2535         /* VFTA - enable all vlan filters */
2536         for (i = 0; i < NUM_VFTA_REGISTERS; i++) {
2537                 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i), 0xFFFFFFFF);
2538         }
2539
2540         /* VFRE: pool enabling for receive - 16 or 32 */
2541         IXGBE_WRITE_REG(hw, IXGBE_VFRE(0), \
2542                         num_pools == ETH_16_POOLS ? 0xFFFF : 0xFFFFFFFF);
2543
2544         /*
2545          * MPSAR - allow pools to read specific mac addresses
2546          * In this case, all pools should be able to read from mac addr 0
2547          */
2548         IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(0), 0xFFFFFFFF);
2549         IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(0), 0xFFFFFFFF);
2550
2551         /* PFVLVF, PFVLVFB: set up filters for vlan tags as configured */
2552         for (i = 0; i < cfg->nb_pool_maps; i++) {
2553                 /* set vlan id in VF register and set the valid bit */
2554                 IXGBE_WRITE_REG(hw, IXGBE_VLVF(i), (IXGBE_VLVF_VIEN | \
2555                                 (cfg->pool_map[i].vlan_id & 0xFFF)));
2556                 /*
2557                  * Put the allowed pools in VFB reg. As we only have 16 or 32
2558                  * pools, we only need to use the first half of the register
2559                  * i.e. bits 0-31
2560                  */
2561                 IXGBE_WRITE_REG(hw, IXGBE_VLVFB(i*2), cfg->pool_map[i].pools);
2562         }
2563 }
2564
2565 /**
2566  * ixgbe_dcb_config_tx_hw_config - Configure general DCB TX parameters
2567  * @hw: pointer to hardware structure
2568  * @dcb_config: pointer to ixgbe_dcb_config structure
2569  */
2570 static void 
2571 ixgbe_dcb_tx_hw_config(struct ixgbe_hw *hw,
2572                struct ixgbe_dcb_config *dcb_config)
2573 {
2574         uint32_t reg;
2575         uint32_t q;
2576         
2577         PMD_INIT_FUNC_TRACE();
2578         if (hw->mac.type != ixgbe_mac_82598EB) {
2579                 /* Disable the Tx desc arbiter so that MTQC can be changed */
2580                 reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
2581                 reg |= IXGBE_RTTDCS_ARBDIS;
2582                 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
2583
2584                 /* Enable DCB for Tx with 8 TCs */
2585                 if (dcb_config->num_tcs.pg_tcs == 8) {
2586                         reg = IXGBE_MTQC_RT_ENA | IXGBE_MTQC_8TC_8TQ;
2587                 }
2588                 else {
2589                         reg = IXGBE_MTQC_RT_ENA | IXGBE_MTQC_4TC_4TQ;
2590                 }
2591                 if (dcb_config->vt_mode)
2592                     reg |= IXGBE_MTQC_VT_ENA;
2593                 IXGBE_WRITE_REG(hw, IXGBE_MTQC, reg);
2594
2595                 /* Disable drop for all queues */
2596                 for (q = 0; q < 128; q++)
2597                         IXGBE_WRITE_REG(hw, IXGBE_QDE,
2598                      (IXGBE_QDE_WRITE | (q << IXGBE_QDE_IDX_SHIFT)));
2599
2600                 /* Enable the Tx desc arbiter */
2601                 reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
2602                 reg &= ~IXGBE_RTTDCS_ARBDIS;
2603                 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
2604
2605                 /* Enable Security TX Buffer IFG for DCB */
2606                 reg = IXGBE_READ_REG(hw, IXGBE_SECTXMINIFG);
2607                 reg |= IXGBE_SECTX_DCB;
2608                 IXGBE_WRITE_REG(hw, IXGBE_SECTXMINIFG, reg);
2609         }
2610         return;
2611 }
2612
2613 /**
2614  * ixgbe_vmdq_dcb_hw_tx_config - Configure general VMDQ+DCB TX parameters
2615  * @dev: pointer to rte_eth_dev structure
2616  * @dcb_config: pointer to ixgbe_dcb_config structure
2617  */
2618 static void
2619 ixgbe_vmdq_dcb_hw_tx_config(struct rte_eth_dev *dev,
2620                         struct ixgbe_dcb_config *dcb_config)
2621 {
2622         struct rte_eth_vmdq_dcb_tx_conf *vmdq_tx_conf =
2623                         &dev->data->dev_conf.tx_adv_conf.vmdq_dcb_tx_conf;
2624         struct ixgbe_hw *hw = 
2625                         IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2626         
2627         PMD_INIT_FUNC_TRACE();
2628         if (hw->mac.type != ixgbe_mac_82598EB)  
2629                 /*PF VF Transmit Enable*/
2630                 IXGBE_WRITE_REG(hw, IXGBE_VFTE(0),
2631                         vmdq_tx_conf->nb_queue_pools == ETH_16_POOLS ? 0xFFFF : 0xFFFFFFFF);
2632     
2633         /*Configure general DCB TX parameters*/
2634         ixgbe_dcb_tx_hw_config(hw,dcb_config);
2635         return;
2636 }
2637
2638 static void 
2639 ixgbe_vmdq_dcb_rx_config(struct rte_eth_dev *dev,
2640                         struct ixgbe_dcb_config *dcb_config)
2641 {
2642         struct rte_eth_vmdq_dcb_conf *vmdq_rx_conf =
2643                         &dev->data->dev_conf.rx_adv_conf.vmdq_dcb_conf;
2644         struct ixgbe_dcb_tc_config *tc;
2645         uint8_t i,j;
2646
2647         /* convert rte_eth_conf.rx_adv_conf to struct ixgbe_dcb_config */
2648         if (vmdq_rx_conf->nb_queue_pools == ETH_16_POOLS ) {
2649                 dcb_config->num_tcs.pg_tcs = ETH_8_TCS;
2650                 dcb_config->num_tcs.pfc_tcs = ETH_8_TCS;
2651         }
2652         else {
2653                 dcb_config->num_tcs.pg_tcs = ETH_4_TCS;
2654                 dcb_config->num_tcs.pfc_tcs = ETH_4_TCS;
2655         }
2656         /* User Priority to Traffic Class mapping */
2657         for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2658                 j = vmdq_rx_conf->dcb_queue[i];
2659                 tc = &dcb_config->tc_config[j];
2660                 tc->path[IXGBE_DCB_RX_CONFIG].up_to_tc_bitmap =
2661                                                 (uint8_t)(1 << j);
2662         }
2663 }
2664
2665 static void 
2666 ixgbe_dcb_vt_tx_config(struct rte_eth_dev *dev,
2667                         struct ixgbe_dcb_config *dcb_config)
2668
2669         struct rte_eth_vmdq_dcb_tx_conf *vmdq_tx_conf =
2670                         &dev->data->dev_conf.tx_adv_conf.vmdq_dcb_tx_conf;
2671         struct ixgbe_dcb_tc_config *tc;
2672         uint8_t i,j;
2673         
2674         /* convert rte_eth_conf.rx_adv_conf to struct ixgbe_dcb_config */
2675         if (vmdq_tx_conf->nb_queue_pools == ETH_16_POOLS ) {
2676                 dcb_config->num_tcs.pg_tcs = ETH_8_TCS;
2677                 dcb_config->num_tcs.pfc_tcs = ETH_8_TCS;
2678         }
2679         else {
2680                 dcb_config->num_tcs.pg_tcs = ETH_4_TCS;
2681                 dcb_config->num_tcs.pfc_tcs = ETH_4_TCS;
2682         }
2683
2684         /* User Priority to Traffic Class mapping */
2685         for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2686                 j = vmdq_tx_conf->dcb_queue[i];
2687                 tc = &dcb_config->tc_config[j];
2688                 tc->path[IXGBE_DCB_TX_CONFIG].up_to_tc_bitmap =
2689                                                 (uint8_t)(1 << j);
2690         }
2691         return;
2692 }
2693
2694 static void 
2695 ixgbe_dcb_rx_config(struct rte_eth_dev *dev,
2696                 struct ixgbe_dcb_config *dcb_config)
2697 {
2698         struct rte_eth_dcb_rx_conf *rx_conf =
2699                         &dev->data->dev_conf.rx_adv_conf.dcb_rx_conf;
2700         struct ixgbe_dcb_tc_config *tc;
2701         uint8_t i,j;
2702
2703         dcb_config->num_tcs.pg_tcs = (uint8_t)rx_conf->nb_tcs;
2704         dcb_config->num_tcs.pfc_tcs = (uint8_t)rx_conf->nb_tcs;
2705         
2706         /* User Priority to Traffic Class mapping */ 
2707         for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2708                 j = rx_conf->dcb_queue[i];
2709                 tc = &dcb_config->tc_config[j];
2710                 tc->path[IXGBE_DCB_RX_CONFIG].up_to_tc_bitmap =
2711                                                 (uint8_t)(1 << j);
2712         }
2713 }
2714
2715 static void 
2716 ixgbe_dcb_tx_config(struct rte_eth_dev *dev,
2717                 struct ixgbe_dcb_config *dcb_config)
2718 {
2719         struct rte_eth_dcb_tx_conf *tx_conf =
2720                         &dev->data->dev_conf.tx_adv_conf.dcb_tx_conf;
2721         struct ixgbe_dcb_tc_config *tc;
2722         uint8_t i,j;
2723
2724         dcb_config->num_tcs.pg_tcs = (uint8_t)tx_conf->nb_tcs;
2725         dcb_config->num_tcs.pfc_tcs = (uint8_t)tx_conf->nb_tcs;
2726     
2727         /* User Priority to Traffic Class mapping */ 
2728         for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2729                 j = tx_conf->dcb_queue[i];
2730                 tc = &dcb_config->tc_config[j];
2731                 tc->path[IXGBE_DCB_TX_CONFIG].up_to_tc_bitmap =
2732                                                 (uint8_t)(1 << j);
2733         }
2734 }
2735
2736 /**
2737  * ixgbe_dcb_rx_hw_config - Configure general DCB RX HW parameters
2738  * @hw: pointer to hardware structure
2739  * @dcb_config: pointer to ixgbe_dcb_config structure
2740  */
2741 static void
2742 ixgbe_dcb_rx_hw_config(struct ixgbe_hw *hw,
2743                struct ixgbe_dcb_config *dcb_config)
2744 {
2745         uint32_t reg;
2746         uint32_t vlanctrl;
2747         uint8_t i;
2748
2749         PMD_INIT_FUNC_TRACE();
2750         /*
2751          * Disable the arbiter before changing parameters
2752          * (always enable recycle mode; WSP)
2753          */
2754         reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC | IXGBE_RTRPCS_ARBDIS;
2755         IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
2756
2757         if (hw->mac.type != ixgbe_mac_82598EB) {
2758                 reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
2759                 if (dcb_config->num_tcs.pg_tcs == 4) {
2760                         if (dcb_config->vt_mode)
2761                                 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
2762                                         IXGBE_MRQC_VMDQRT4TCEN;
2763                         else {
2764                                 IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, 0);
2765                                 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
2766                                         IXGBE_MRQC_RT4TCEN;
2767                         }
2768                 }
2769                 if (dcb_config->num_tcs.pg_tcs == 8) {
2770                         if (dcb_config->vt_mode)
2771                                 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
2772                                         IXGBE_MRQC_VMDQRT8TCEN;
2773                         else {
2774                                 IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, 0);
2775                                 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
2776                                         IXGBE_MRQC_RT8TCEN;
2777                         }
2778                 }
2779
2780                 IXGBE_WRITE_REG(hw, IXGBE_MRQC, reg);
2781         }
2782
2783         /* VLNCTRL: enable vlan filtering and allow all vlan tags through */
2784         vlanctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
2785         vlanctrl |= IXGBE_VLNCTRL_VFE ; /* enable vlan filters */
2786         IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlanctrl);
2787  
2788         /* VFTA - enable all vlan filters */
2789         for (i = 0; i < NUM_VFTA_REGISTERS; i++) {
2790                 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i), 0xFFFFFFFF);
2791         }
2792
2793         /*
2794          * Configure Rx packet plane (recycle mode; WSP) and
2795          * enable arbiter
2796          */
2797         reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC;
2798         IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
2799  
2800         return;
2801 }
2802
2803 static void 
2804 ixgbe_dcb_hw_arbite_rx_config(struct ixgbe_hw *hw, uint16_t *refill,
2805                         uint16_t *max,uint8_t *bwg_id, uint8_t *tsa, uint8_t *map)
2806 {
2807         switch (hw->mac.type) {
2808         case ixgbe_mac_82598EB:
2809                 ixgbe_dcb_config_rx_arbiter_82598(hw, refill, max, tsa);
2810                 break;
2811         case ixgbe_mac_82599EB:
2812         case ixgbe_mac_X540:
2813                 ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id,
2814                                                   tsa, map);
2815                 break;
2816         default:
2817                 break;
2818         }
2819 }
2820
2821 static void 
2822 ixgbe_dcb_hw_arbite_tx_config(struct ixgbe_hw *hw, uint16_t *refill, uint16_t *max,
2823                             uint8_t *bwg_id, uint8_t *tsa, uint8_t *map)
2824 {
2825         switch (hw->mac.type) {
2826         case ixgbe_mac_82598EB:
2827                 ixgbe_dcb_config_tx_desc_arbiter_82598(hw, refill, max, bwg_id,tsa);
2828                 ixgbe_dcb_config_tx_data_arbiter_82598(hw, refill, max, bwg_id,tsa);
2829                 break;
2830         case ixgbe_mac_82599EB:
2831         case ixgbe_mac_X540:
2832                 ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max, bwg_id,tsa);
2833                 ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max, bwg_id,tsa, map);
2834                 break;
2835         default:
2836                 break;
2837         }
2838 }
2839
2840 #define DCB_RX_CONFIG  1
2841 #define DCB_TX_CONFIG  1
2842 #define DCB_TX_PB      1024
2843 /**
2844  * ixgbe_dcb_hw_configure - Enable DCB and configure 
2845  * general DCB in VT mode and non-VT mode parameters
2846  * @dev: pointer to rte_eth_dev structure
2847  * @dcb_config: pointer to ixgbe_dcb_config structure
2848  */
2849 static int
2850 ixgbe_dcb_hw_configure(struct rte_eth_dev *dev,
2851                         struct ixgbe_dcb_config *dcb_config)
2852 {
2853         int     ret = 0;
2854         uint8_t i,pfc_en,nb_tcs;
2855         uint16_t pbsize;
2856         uint8_t config_dcb_rx = 0;
2857         uint8_t config_dcb_tx = 0;
2858         uint8_t tsa[IXGBE_DCB_MAX_TRAFFIC_CLASS] = {0};
2859         uint8_t bwgid[IXGBE_DCB_MAX_TRAFFIC_CLASS] = {0};
2860         uint16_t refill[IXGBE_DCB_MAX_TRAFFIC_CLASS] = {0};
2861         uint16_t max[IXGBE_DCB_MAX_TRAFFIC_CLASS] = {0};
2862         uint8_t map[IXGBE_DCB_MAX_TRAFFIC_CLASS] = {0};
2863         struct ixgbe_dcb_tc_config *tc;
2864         uint32_t max_frame = dev->data->max_frame_size;
2865         struct ixgbe_hw *hw = 
2866                         IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
2867
2868         switch(dev->data->dev_conf.rxmode.mq_mode){
2869         case ETH_MQ_RX_VMDQ_DCB:
2870                 dcb_config->vt_mode = true;
2871                 if (hw->mac.type != ixgbe_mac_82598EB) {
2872                         config_dcb_rx = DCB_RX_CONFIG;
2873                         /*
2874                          *get dcb and VT rx configuration parameters 
2875                          *from rte_eth_conf
2876                          */
2877                         ixgbe_vmdq_dcb_rx_config(dev,dcb_config);
2878                         /*Configure general VMDQ and DCB RX parameters*/
2879                         ixgbe_vmdq_dcb_configure(dev);
2880                 }
2881                 break;
2882         case ETH_MQ_RX_DCB:
2883                 dcb_config->vt_mode = false;
2884                 config_dcb_rx = DCB_RX_CONFIG;
2885                 /* Get dcb TX configuration parameters from rte_eth_conf */
2886                 ixgbe_dcb_rx_config(dev,dcb_config);
2887                 /*Configure general DCB RX parameters*/
2888                 ixgbe_dcb_rx_hw_config(hw, dcb_config);
2889                 break;
2890         default:
2891                 PMD_INIT_LOG(ERR, "Incorrect DCB RX mode configuration\n");
2892                 break;
2893         }
2894         switch (dev->data->dev_conf.txmode.mq_mode) {
2895         case ETH_MQ_TX_VMDQ_DCB:
2896                 dcb_config->vt_mode = true;
2897                 config_dcb_tx = DCB_TX_CONFIG;
2898                 /* get DCB and VT TX configuration parameters from rte_eth_conf */
2899                 ixgbe_dcb_vt_tx_config(dev,dcb_config);
2900                 /*Configure general VMDQ and DCB TX parameters*/
2901                 ixgbe_vmdq_dcb_hw_tx_config(dev,dcb_config);
2902                 break;
2903
2904         case ETH_MQ_TX_DCB:
2905                 dcb_config->vt_mode = false;
2906                 config_dcb_tx = DCB_TX_CONFIG;
2907                 /*get DCB TX configuration parameters from rte_eth_conf*/
2908                 ixgbe_dcb_tx_config(dev,dcb_config);
2909                 /*Configure general DCB TX parameters*/
2910                 ixgbe_dcb_tx_hw_config(hw, dcb_config);
2911                 break;
2912         default:
2913                 PMD_INIT_LOG(ERR, "Incorrect DCB TX mode configuration\n");
2914                 break;
2915         }
2916
2917         nb_tcs = dcb_config->num_tcs.pfc_tcs;
2918         /* Unpack map */
2919         ixgbe_dcb_unpack_map_cee(dcb_config, IXGBE_DCB_RX_CONFIG, map);
2920         if(nb_tcs == ETH_4_TCS) {
2921                 /* Avoid un-configured priority mapping to TC0 */
2922                 uint8_t j = 4;
2923                 uint8_t mask = 0xFF;
2924                 for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES - 4; i++) 
2925                         mask = (uint8_t)(mask & (~ (1 << map[i])));
2926                 for (i = 0; mask && (i < IXGBE_DCB_MAX_TRAFFIC_CLASS); i++) {
2927                         if ((mask & 0x1) && (j < ETH_DCB_NUM_USER_PRIORITIES))
2928                                 map[j++] = i;
2929                         mask >>= 1;
2930                 }
2931                 /* Re-configure 4 TCs BW */
2932                 for (i = 0; i < nb_tcs; i++) {
2933                         tc = &dcb_config->tc_config[i];
2934                         tc->path[IXGBE_DCB_TX_CONFIG].bwg_percent =
2935                                                 (uint8_t)(100 / nb_tcs);
2936                         tc->path[IXGBE_DCB_RX_CONFIG].bwg_percent =
2937                                                 (uint8_t)(100 / nb_tcs);
2938                 }
2939                 for (; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
2940                         tc = &dcb_config->tc_config[i];
2941                         tc->path[IXGBE_DCB_TX_CONFIG].bwg_percent = 0;
2942                         tc->path[IXGBE_DCB_RX_CONFIG].bwg_percent = 0;
2943                 }
2944         }
2945
2946         if(config_dcb_rx) {
2947                 /* Set RX buffer size */
2948                 pbsize = (uint16_t)(NIC_RX_BUFFER_SIZE / nb_tcs);
2949                 uint32_t rxpbsize = pbsize << IXGBE_RXPBSIZE_SHIFT;
2950                 for (i = 0 ; i < nb_tcs; i++) {
2951                         IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpbsize);
2952                 }
2953                 /* zero alloc all unused TCs */
2954                 for (; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2955                         IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), 0);
2956                 }
2957         }
2958         if(config_dcb_tx) {
2959                 /* Only support an equally distributed Tx packet buffer strategy. */
2960                 uint32_t txpktsize = IXGBE_TXPBSIZE_MAX / nb_tcs;
2961                 uint32_t txpbthresh = (txpktsize / DCB_TX_PB) - IXGBE_TXPKT_SIZE_MAX;
2962                 for (i = 0; i < nb_tcs; i++) {
2963                         IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), txpktsize);
2964                         IXGBE_WRITE_REG(hw, IXGBE_TXPBTHRESH(i), txpbthresh);
2965                 }
2966                 /* Clear unused TCs, if any, to zero buffer size*/
2967                 for (; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2968                         IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), 0);
2969                         IXGBE_WRITE_REG(hw, IXGBE_TXPBTHRESH(i), 0);
2970                 }
2971         }
2972
2973         /*Calculates traffic class credits*/
2974         ixgbe_dcb_calculate_tc_credits_cee(hw, dcb_config,max_frame,
2975                                 IXGBE_DCB_TX_CONFIG);
2976         ixgbe_dcb_calculate_tc_credits_cee(hw, dcb_config,max_frame,
2977                                 IXGBE_DCB_RX_CONFIG);
2978
2979         if(config_dcb_rx) {
2980                 /* Unpack CEE standard containers */
2981                 ixgbe_dcb_unpack_refill_cee(dcb_config, IXGBE_DCB_RX_CONFIG, refill);
2982                 ixgbe_dcb_unpack_max_cee(dcb_config, max);
2983                 ixgbe_dcb_unpack_bwgid_cee(dcb_config, IXGBE_DCB_RX_CONFIG, bwgid);
2984                 ixgbe_dcb_unpack_tsa_cee(dcb_config, IXGBE_DCB_RX_CONFIG, tsa);
2985                 /* Configure PG(ETS) RX */
2986                 ixgbe_dcb_hw_arbite_rx_config(hw,refill,max,bwgid,tsa,map);
2987         }
2988
2989         if(config_dcb_tx) {
2990                 /* Unpack CEE standard containers */
2991                 ixgbe_dcb_unpack_refill_cee(dcb_config, IXGBE_DCB_TX_CONFIG, refill);
2992                 ixgbe_dcb_unpack_max_cee(dcb_config, max);
2993                 ixgbe_dcb_unpack_bwgid_cee(dcb_config, IXGBE_DCB_TX_CONFIG, bwgid);
2994                 ixgbe_dcb_unpack_tsa_cee(dcb_config, IXGBE_DCB_TX_CONFIG, tsa);
2995                 /* Configure PG(ETS) TX */
2996                 ixgbe_dcb_hw_arbite_tx_config(hw,refill,max,bwgid,tsa,map);
2997         }
2998
2999         /*Configure queue statistics registers*/
3000         ixgbe_dcb_config_tc_stats_82599(hw, dcb_config);
3001
3002         /* Check if the PFC is supported */
3003         if(dev->data->dev_conf.dcb_capability_en & ETH_DCB_PFC_SUPPORT) {
3004                 pbsize = (uint16_t) (NIC_RX_BUFFER_SIZE / nb_tcs);
3005                 for (i = 0; i < nb_tcs; i++) {
3006                         /*
3007                         * If the TC count is 8,and the default high_water is 48,
3008                         * the low_water is 16 as default.
3009                         */
3010                         hw->fc.high_water[i] = (pbsize * 3 ) / 4;
3011                         hw->fc.low_water[i] = pbsize / 4;
3012                         /* Enable pfc for this TC */
3013                         tc = &dcb_config->tc_config[i];
3014                         tc->pfc = ixgbe_dcb_pfc_enabled;
3015                 }
3016                 ixgbe_dcb_unpack_pfc_cee(dcb_config, map, &pfc_en);
3017                 if(dcb_config->num_tcs.pfc_tcs == ETH_4_TCS)
3018                         pfc_en &= 0x0F;
3019                 ret = ixgbe_dcb_config_pfc(hw, pfc_en, map);
3020         }
3021
3022         return ret;
3023 }
3024
3025 /**
3026  * ixgbe_configure_dcb - Configure DCB  Hardware
3027  * @dev: pointer to rte_eth_dev
3028  */
3029 void ixgbe_configure_dcb(struct rte_eth_dev *dev)
3030 {
3031         struct ixgbe_dcb_config *dcb_cfg =
3032                         IXGBE_DEV_PRIVATE_TO_DCB_CFG(dev->data->dev_private); 
3033         struct rte_eth_conf *dev_conf = &(dev->data->dev_conf);
3034         
3035         PMD_INIT_FUNC_TRACE();  
3036         
3037         /* check support mq_mode for DCB */
3038         if ((dev_conf->rxmode.mq_mode != ETH_MQ_RX_VMDQ_DCB) && 
3039             (dev_conf->rxmode.mq_mode != ETH_MQ_RX_DCB)) 
3040                 return;
3041
3042         if (dev->data->nb_rx_queues != ETH_DCB_NUM_QUEUES)
3043                 return;
3044
3045         /** Configure DCB hardware **/
3046         ixgbe_dcb_hw_configure(dev,dcb_cfg);
3047         
3048         return;
3049 }
3050
3051 static int
3052 ixgbe_alloc_rx_queue_mbufs(struct igb_rx_queue *rxq)
3053 {
3054         struct igb_rx_entry *rxe = rxq->sw_ring;
3055         uint64_t dma_addr;
3056         unsigned i;
3057
3058         /* Initialize software ring entries */
3059         for (i = 0; i < rxq->nb_rx_desc; i++) {
3060                 volatile union ixgbe_adv_rx_desc *rxd;
3061                 struct rte_mbuf *mbuf = rte_rxmbuf_alloc(rxq->mb_pool);
3062                 if (mbuf == NULL) {
3063                         PMD_INIT_LOG(ERR, "RX mbuf alloc failed queue_id=%u\n",
3064                                      (unsigned) rxq->queue_id);
3065                         return (-ENOMEM);
3066                 }
3067
3068                 rte_mbuf_refcnt_set(mbuf, 1);
3069                 mbuf->type = RTE_MBUF_PKT;
3070                 mbuf->pkt.next = NULL;
3071                 mbuf->pkt.data = (char *)mbuf->buf_addr + RTE_PKTMBUF_HEADROOM;
3072                 mbuf->pkt.nb_segs = 1;
3073                 mbuf->pkt.in_port = rxq->port_id;
3074
3075                 dma_addr =
3076                         rte_cpu_to_le_64(RTE_MBUF_DATA_DMA_ADDR_DEFAULT(mbuf));
3077                 rxd = &rxq->rx_ring[i];
3078                 rxd->read.hdr_addr = dma_addr;
3079                 rxd->read.pkt_addr = dma_addr;
3080                 rxe[i].mbuf = mbuf;
3081         }
3082
3083         return 0;
3084 }
3085
3086 static int
3087 ixgbe_dev_mq_rx_configure(struct rte_eth_dev *dev)
3088 {
3089         struct ixgbe_hw *hw = 
3090                 IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3091
3092         if (hw->mac.type == ixgbe_mac_82598EB)
3093                 return 0;
3094
3095         if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
3096                 /* 
3097                  * SRIOV inactive scheme
3098                  * any DCB/RSS w/o VMDq multi-queue setting
3099                  */
3100                 if (dev->data->nb_rx_queues > 1)
3101                         switch (dev->data->dev_conf.rxmode.mq_mode) {
3102                         case ETH_MQ_RX_NONE:
3103                                 /* if mq_mode not assign, we use rss mode.*/
3104                         case ETH_MQ_RX_RSS:
3105                                 ixgbe_rss_configure(dev);
3106                                 break;
3107
3108                         case ETH_MQ_RX_VMDQ_DCB:
3109                                 ixgbe_vmdq_dcb_configure(dev);
3110                                 break;
3111                                 
3112                         default: ixgbe_rss_disable(dev);
3113                         }
3114                 else
3115                         ixgbe_rss_disable(dev);
3116         } else {
3117                 switch (RTE_ETH_DEV_SRIOV(dev).active) {
3118                 /*
3119                  * SRIOV active scheme
3120                  * FIXME if support DCB/RSS together with VMDq & SRIOV
3121                  */
3122                 case ETH_64_POOLS:
3123                         IXGBE_WRITE_REG(hw, IXGBE_MRQC, IXGBE_MRQC_VMDQEN);
3124                         break;
3125
3126                 case ETH_32_POOLS:
3127                         IXGBE_WRITE_REG(hw, IXGBE_MRQC, IXGBE_MRQC_VMDQRT4TCEN);
3128                         break;
3129                 
3130                 case ETH_16_POOLS:
3131                         IXGBE_WRITE_REG(hw, IXGBE_MRQC, IXGBE_MRQC_VMDQRT8TCEN);
3132                         break;
3133                 default:
3134                         RTE_LOG(ERR, PMD, "invalid pool number in IOV mode\n");
3135                 }
3136         }
3137
3138         return 0;
3139 }
3140
3141 static int
3142 ixgbe_dev_mq_tx_configure(struct rte_eth_dev *dev)
3143 {
3144         struct ixgbe_hw *hw = 
3145                 IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3146         uint32_t mtqc;
3147         uint32_t rttdcs;
3148
3149         if (hw->mac.type == ixgbe_mac_82598EB)
3150                 return 0;
3151
3152         /* disable arbiter before setting MTQC */
3153         rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
3154         rttdcs |= IXGBE_RTTDCS_ARBDIS;
3155         IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
3156
3157         if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
3158                 /* 
3159                  * SRIOV inactive scheme
3160                  * any DCB w/o VMDq multi-queue setting
3161                  */
3162                 mtqc = IXGBE_MTQC_64Q_1PB;
3163         } else {
3164                 switch (RTE_ETH_DEV_SRIOV(dev).active) {
3165
3166                 /*
3167                  * SRIOV active scheme
3168                  * FIXME if support DCB together with VMDq & SRIOV
3169                  */
3170                 case ETH_64_POOLS:
3171                         mtqc = IXGBE_MTQC_VT_ENA | IXGBE_MTQC_64VF;
3172                         break;
3173                 case ETH_32_POOLS:
3174                         mtqc = IXGBE_MTQC_VT_ENA | IXGBE_MTQC_32VF;
3175                         break;
3176                 case ETH_16_POOLS:
3177                         mtqc = IXGBE_MTQC_VT_ENA | IXGBE_MTQC_RT_ENA | 
3178                                 IXGBE_MTQC_8TC_8TQ;
3179                         break;
3180                 default:
3181                         mtqc = IXGBE_MTQC_64Q_1PB;
3182                         RTE_LOG(ERR, PMD, "invalid pool number in IOV mode\n");
3183                 }
3184         }
3185         
3186         IXGBE_WRITE_REG(hw, IXGBE_MTQC, mtqc);
3187
3188         /* re-enable arbiter */
3189         rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
3190         IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
3191
3192         return 0;
3193 }
3194
3195 /*
3196  * Initializes Receive Unit.
3197  */
3198 int
3199 ixgbe_dev_rx_init(struct rte_eth_dev *dev)
3200 {
3201         struct ixgbe_hw     *hw;
3202         struct igb_rx_queue *rxq;
3203         struct rte_pktmbuf_pool_private *mbp_priv;
3204         uint64_t bus_addr;
3205         uint32_t rxctrl;
3206         uint32_t fctrl;
3207         uint32_t hlreg0;
3208         uint32_t maxfrs;
3209         uint32_t srrctl;
3210         uint32_t rdrxctl;
3211         uint32_t rxcsum;
3212         uint16_t buf_size;
3213         uint16_t i;
3214         int ret;
3215
3216         PMD_INIT_FUNC_TRACE();
3217         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3218
3219         /*
3220          * Make sure receives are disabled while setting
3221          * up the RX context (registers, descriptor rings, etc.).
3222          */
3223         rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
3224         IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl & ~IXGBE_RXCTRL_RXEN);
3225
3226         /* Enable receipt of broadcasted frames */
3227         fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
3228         fctrl |= IXGBE_FCTRL_BAM;
3229         fctrl |= IXGBE_FCTRL_DPF;
3230         fctrl |= IXGBE_FCTRL_PMCF;
3231         IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
3232
3233         /*
3234          * Configure CRC stripping, if any.
3235          */
3236         hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
3237         if (dev->data->dev_conf.rxmode.hw_strip_crc)
3238                 hlreg0 |= IXGBE_HLREG0_RXCRCSTRP;
3239         else
3240                 hlreg0 &= ~IXGBE_HLREG0_RXCRCSTRP;
3241
3242         /*
3243          * Configure jumbo frame support, if any.
3244          */
3245         if (dev->data->dev_conf.rxmode.jumbo_frame == 1) {
3246                 hlreg0 |= IXGBE_HLREG0_JUMBOEN;
3247                 maxfrs = IXGBE_READ_REG(hw, IXGBE_MAXFRS);
3248                 maxfrs &= 0x0000FFFF;
3249                 maxfrs |= (dev->data->dev_conf.rxmode.max_rx_pkt_len << 16);
3250                 IXGBE_WRITE_REG(hw, IXGBE_MAXFRS, maxfrs);
3251         } else
3252                 hlreg0 &= ~IXGBE_HLREG0_JUMBOEN;
3253
3254         IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
3255
3256         /* Setup RX queues */
3257         for (i = 0; i < dev->data->nb_rx_queues; i++) {
3258                 rxq = dev->data->rx_queues[i];
3259
3260                 /* Allocate buffers for descriptor rings */
3261                 ret = ixgbe_alloc_rx_queue_mbufs(rxq);
3262                 if (ret)
3263                         return ret;
3264
3265                 /*
3266                  * Reset crc_len in case it was changed after queue setup by a
3267                  * call to configure.
3268                  */
3269                 rxq->crc_len = (uint8_t)
3270                                 ((dev->data->dev_conf.rxmode.hw_strip_crc) ? 0 :
3271                                 ETHER_CRC_LEN);
3272
3273                 /* Setup the Base and Length of the Rx Descriptor Rings */
3274                 bus_addr = rxq->rx_ring_phys_addr;
3275                 IXGBE_WRITE_REG(hw, IXGBE_RDBAL(rxq->reg_idx),
3276                                 (uint32_t)(bus_addr & 0x00000000ffffffffULL));
3277                 IXGBE_WRITE_REG(hw, IXGBE_RDBAH(rxq->reg_idx),
3278                                 (uint32_t)(bus_addr >> 32));
3279                 IXGBE_WRITE_REG(hw, IXGBE_RDLEN(rxq->reg_idx),
3280                                 rxq->nb_rx_desc * sizeof(union ixgbe_adv_rx_desc));
3281                 IXGBE_WRITE_REG(hw, IXGBE_RDH(rxq->reg_idx), 0);
3282                 IXGBE_WRITE_REG(hw, IXGBE_RDT(rxq->reg_idx), 0);
3283
3284                 /* Configure the SRRCTL register */
3285 #ifdef RTE_HEADER_SPLIT_ENABLE
3286                 /*
3287                  * Configure Header Split
3288                  */
3289                 if (dev->data->dev_conf.rxmode.header_split) {
3290                         if (hw->mac.type == ixgbe_mac_82599EB) {
3291                                 /* Must setup the PSRTYPE register */
3292                                 uint32_t psrtype;
3293                                 psrtype = IXGBE_PSRTYPE_TCPHDR |
3294                                         IXGBE_PSRTYPE_UDPHDR   |
3295                                         IXGBE_PSRTYPE_IPV4HDR  |
3296                                         IXGBE_PSRTYPE_IPV6HDR;
3297                                 IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(rxq->reg_idx), psrtype);
3298                         }
3299                         srrctl = ((dev->data->dev_conf.rxmode.split_hdr_size <<
3300                                    IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) &
3301                                   IXGBE_SRRCTL_BSIZEHDR_MASK);
3302                         srrctl |= E1000_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS;
3303                 } else
3304 #endif
3305                         srrctl = IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
3306
3307                 /* Set if packets are dropped when no descriptors available */
3308                 if (rxq->drop_en)
3309                         srrctl |= IXGBE_SRRCTL_DROP_EN;
3310
3311                 /*
3312                  * Configure the RX buffer size in the BSIZEPACKET field of
3313                  * the SRRCTL register of the queue.
3314                  * The value is in 1 KB resolution. Valid values can be from
3315                  * 1 KB to 16 KB.
3316                  */
3317                 mbp_priv = (struct rte_pktmbuf_pool_private *)
3318                         ((char *)rxq->mb_pool + sizeof(struct rte_mempool));
3319                 buf_size = (uint16_t) (mbp_priv->mbuf_data_room_size -
3320                                        RTE_PKTMBUF_HEADROOM);
3321                 srrctl |= ((buf_size >> IXGBE_SRRCTL_BSIZEPKT_SHIFT) &
3322                            IXGBE_SRRCTL_BSIZEPKT_MASK);
3323                 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxq->reg_idx), srrctl);
3324
3325                 buf_size = (uint16_t) ((srrctl & IXGBE_SRRCTL_BSIZEPKT_MASK) <<
3326                                        IXGBE_SRRCTL_BSIZEPKT_SHIFT);
3327
3328                 /* It adds dual VLAN length for supporting dual VLAN */
3329                 if ((dev->data->dev_conf.rxmode.max_rx_pkt_len +
3330                                 2 * IXGBE_VLAN_TAG_SIZE) > buf_size){
3331                         dev->data->scattered_rx = 1;
3332                         dev->rx_pkt_burst = ixgbe_recv_scattered_pkts;
3333                 }
3334         }
3335
3336         /*
3337          * Device configured with multiple RX queues.
3338          */
3339         ixgbe_dev_mq_rx_configure(dev);
3340
3341         /*
3342          * Setup the Checksum Register.
3343          * Disable Full-Packet Checksum which is mutually exclusive with RSS.
3344          * Enable IP/L4 checkum computation by hardware if requested to do so.
3345          */
3346         rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
3347         rxcsum |= IXGBE_RXCSUM_PCSD;
3348         if (dev->data->dev_conf.rxmode.hw_ip_checksum)
3349                 rxcsum |= IXGBE_RXCSUM_IPPCSE;
3350         else
3351                 rxcsum &= ~IXGBE_RXCSUM_IPPCSE;
3352
3353         IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
3354
3355         if (hw->mac.type == ixgbe_mac_82599EB) {
3356                 rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
3357                 if (dev->data->dev_conf.rxmode.hw_strip_crc)
3358                         rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP;
3359                 else
3360                         rdrxctl &= ~IXGBE_RDRXCTL_CRCSTRIP;
3361                 rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE;
3362                 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl);
3363         }
3364
3365         return 0;
3366 }
3367
3368 /*
3369  * Initializes Transmit Unit.
3370  */
3371 void
3372 ixgbe_dev_tx_init(struct rte_eth_dev *dev)
3373 {
3374         struct ixgbe_hw     *hw;
3375         struct igb_tx_queue *txq;
3376         uint64_t bus_addr;
3377         uint32_t hlreg0;
3378         uint32_t txctrl;
3379         uint16_t i;
3380
3381         PMD_INIT_FUNC_TRACE();
3382         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3383
3384         /* Enable TX CRC (checksum offload requirement) */
3385         hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
3386         hlreg0 |= IXGBE_HLREG0_TXCRCEN;
3387         IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
3388
3389         /* Setup the Base and Length of the Tx Descriptor Rings */
3390         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3391                 txq = dev->data->tx_queues[i];
3392
3393                 bus_addr = txq->tx_ring_phys_addr;
3394                 IXGBE_WRITE_REG(hw, IXGBE_TDBAL(txq->reg_idx),
3395                                 (uint32_t)(bus_addr & 0x00000000ffffffffULL));
3396                 IXGBE_WRITE_REG(hw, IXGBE_TDBAH(txq->reg_idx),
3397                                 (uint32_t)(bus_addr >> 32));
3398                 IXGBE_WRITE_REG(hw, IXGBE_TDLEN(txq->reg_idx),
3399                                 txq->nb_tx_desc * sizeof(union ixgbe_adv_tx_desc));
3400                 /* Setup the HW Tx Head and TX Tail descriptor pointers */
3401                 IXGBE_WRITE_REG(hw, IXGBE_TDH(txq->reg_idx), 0);
3402                 IXGBE_WRITE_REG(hw, IXGBE_TDT(txq->reg_idx), 0);
3403
3404                 /*
3405                  * Disable Tx Head Writeback RO bit, since this hoses
3406                  * bookkeeping if things aren't delivered in order.
3407                  */
3408                 switch (hw->mac.type) {
3409                         case ixgbe_mac_82598EB:
3410                                 txctrl = IXGBE_READ_REG(hw,
3411                                                         IXGBE_DCA_TXCTRL(txq->reg_idx));
3412                                 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
3413                                 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(txq->reg_idx),
3414                                                 txctrl);
3415                                 break;
3416
3417                         case ixgbe_mac_82599EB:
3418                         case ixgbe_mac_X540:
3419                         default:
3420                                 txctrl = IXGBE_READ_REG(hw,
3421                                                 IXGBE_DCA_TXCTRL_82599(txq->reg_idx));
3422                                 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
3423                                 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(txq->reg_idx),
3424                                                 txctrl);
3425                                 break;
3426                 }
3427         }
3428
3429         /* Device configured with multiple TX queues. */
3430         ixgbe_dev_mq_tx_configure(dev);
3431 }
3432
3433 /*
3434  * Start Transmit and Receive Units.
3435  */
3436 void
3437 ixgbe_dev_rxtx_start(struct rte_eth_dev *dev)
3438 {
3439         struct ixgbe_hw     *hw;
3440         struct igb_tx_queue *txq;
3441         struct igb_rx_queue *rxq;
3442         uint32_t txdctl;
3443         uint32_t dmatxctl;
3444         uint32_t rxdctl;
3445         uint32_t rxctrl;
3446         uint16_t i;
3447         int poll_ms;
3448
3449         PMD_INIT_FUNC_TRACE();
3450         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3451
3452         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3453                 txq = dev->data->tx_queues[i];
3454                 /* Setup Transmit Threshold Registers */
3455                 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txq->reg_idx));
3456                 txdctl |= txq->pthresh & 0x7F;
3457                 txdctl |= ((txq->hthresh & 0x7F) << 8);
3458                 txdctl |= ((txq->wthresh & 0x7F) << 16);
3459                 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txq->reg_idx), txdctl);
3460         }
3461
3462         if (hw->mac.type != ixgbe_mac_82598EB) {
3463                 dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
3464                 dmatxctl |= IXGBE_DMATXCTL_TE;
3465                 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
3466         }
3467
3468         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3469                 txq = dev->data->tx_queues[i];
3470                 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txq->reg_idx));
3471                 txdctl |= IXGBE_TXDCTL_ENABLE;
3472                 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txq->reg_idx), txdctl);
3473
3474                 /* Wait until TX Enable ready */
3475                 if (hw->mac.type == ixgbe_mac_82599EB) {
3476                         poll_ms = 10;
3477                         do {
3478                                 rte_delay_ms(1);
3479                                 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txq->reg_idx));
3480                         } while (--poll_ms && !(txdctl & IXGBE_TXDCTL_ENABLE));
3481                         if (!poll_ms)
3482                                 PMD_INIT_LOG(ERR, "Could not enable "
3483                                              "Tx Queue %d\n", i);
3484                 }
3485         }
3486         for (i = 0; i < dev->data->nb_rx_queues; i++) {
3487                 rxq = dev->data->rx_queues[i];
3488                 rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxq->reg_idx));
3489                 rxdctl |= IXGBE_RXDCTL_ENABLE;
3490                 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxq->reg_idx), rxdctl);
3491
3492                 /* Wait until RX Enable ready */
3493                 poll_ms = 10;
3494                 do {
3495                         rte_delay_ms(1);
3496                         rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxq->reg_idx));
3497                 } while (--poll_ms && !(rxdctl & IXGBE_RXDCTL_ENABLE));
3498                 if (!poll_ms)
3499                         PMD_INIT_LOG(ERR, "Could not enable "
3500                                      "Rx Queue %d\n", i);
3501                 rte_wmb();
3502                 IXGBE_WRITE_REG(hw, IXGBE_RDT(rxq->reg_idx), rxq->nb_rx_desc - 1);
3503         }
3504
3505         /* Enable Receive engine */
3506         rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
3507         if (hw->mac.type == ixgbe_mac_82598EB)
3508                 rxctrl |= IXGBE_RXCTRL_DMBYPS;
3509         rxctrl |= IXGBE_RXCTRL_RXEN;
3510         hw->mac.ops.enable_rx_dma(hw, rxctrl);
3511 }
3512
3513
3514 /*
3515  * [VF] Initializes Receive Unit.
3516  */
3517 int
3518 ixgbevf_dev_rx_init(struct rte_eth_dev *dev)
3519 {
3520         struct ixgbe_hw     *hw;
3521         struct igb_rx_queue *rxq;
3522         struct rte_pktmbuf_pool_private *mbp_priv;
3523         uint64_t bus_addr;
3524         uint32_t srrctl;
3525         uint16_t buf_size;
3526         uint16_t i;
3527         int ret;
3528
3529         PMD_INIT_FUNC_TRACE();
3530         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3531
3532         /* Setup RX queues */
3533         dev->rx_pkt_burst = ixgbe_recv_pkts;
3534         for (i = 0; i < dev->data->nb_rx_queues; i++) {
3535                 rxq = dev->data->rx_queues[i];
3536
3537                 /* Allocate buffers for descriptor rings */
3538                 ret = ixgbe_alloc_rx_queue_mbufs(rxq);
3539                 if (ret)
3540                         return ret;
3541
3542                 /* Setup the Base and Length of the Rx Descriptor Rings */
3543                 bus_addr = rxq->rx_ring_phys_addr;
3544
3545                 IXGBE_WRITE_REG(hw, IXGBE_VFRDBAL(i),
3546                                 (uint32_t)(bus_addr & 0x00000000ffffffffULL));
3547                 IXGBE_WRITE_REG(hw, IXGBE_VFRDBAH(i),
3548                                 (uint32_t)(bus_addr >> 32));
3549                 IXGBE_WRITE_REG(hw, IXGBE_VFRDLEN(i),
3550                                 rxq->nb_rx_desc * sizeof(union ixgbe_adv_rx_desc));
3551                 IXGBE_WRITE_REG(hw, IXGBE_VFRDH(i), 0);
3552                 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(i), 0);
3553
3554
3555                 /* Configure the SRRCTL register */
3556 #ifdef RTE_HEADER_SPLIT_ENABLE
3557                 /*
3558                  * Configure Header Split
3559                  */
3560                 if (dev->data->dev_conf.rxmode.header_split) {
3561
3562                         /* Must setup the PSRTYPE register */
3563                         uint32_t psrtype;
3564                         psrtype = IXGBE_PSRTYPE_TCPHDR |
3565                                 IXGBE_PSRTYPE_UDPHDR   |
3566                                 IXGBE_PSRTYPE_IPV4HDR  |
3567                                 IXGBE_PSRTYPE_IPV6HDR;
3568
3569                         IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE(i), psrtype);
3570
3571                         srrctl = ((dev->data->dev_conf.rxmode.split_hdr_size <<
3572                                    IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) &
3573                                   IXGBE_SRRCTL_BSIZEHDR_MASK);
3574                         srrctl |= E1000_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS;
3575                 } else
3576 #endif
3577                         srrctl = IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
3578
3579                 /* Set if packets are dropped when no descriptors available */
3580                 if (rxq->drop_en)
3581                         srrctl |= IXGBE_SRRCTL_DROP_EN;
3582
3583                 /*
3584                  * Configure the RX buffer size in the BSIZEPACKET field of
3585                  * the SRRCTL register of the queue.
3586                  * The value is in 1 KB resolution. Valid values can be from
3587                  * 1 KB to 16 KB.
3588                  */
3589                 mbp_priv = (struct rte_pktmbuf_pool_private *)
3590                         ((char *)rxq->mb_pool + sizeof(struct rte_mempool));
3591                 buf_size = (uint16_t) (mbp_priv->mbuf_data_room_size -
3592                                        RTE_PKTMBUF_HEADROOM);
3593                 srrctl |= ((buf_size >> IXGBE_SRRCTL_BSIZEPKT_SHIFT) &
3594                            IXGBE_SRRCTL_BSIZEPKT_MASK);
3595
3596                 /*
3597                  * VF modification to write virtual function SRRCTL register
3598                  */
3599                 IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(i), srrctl);
3600
3601                 buf_size = (uint16_t) ((srrctl & IXGBE_SRRCTL_BSIZEPKT_MASK) <<
3602                                        IXGBE_SRRCTL_BSIZEPKT_SHIFT);
3603
3604                 /* It adds dual VLAN length for supporting dual VLAN */
3605                 if ((dev->data->dev_conf.rxmode.max_rx_pkt_len +
3606                                 2 * IXGBE_VLAN_TAG_SIZE) > buf_size) {
3607                         dev->data->scattered_rx = 1;
3608                         dev->rx_pkt_burst = ixgbe_recv_scattered_pkts;
3609                 }
3610         }
3611
3612         return 0;
3613 }
3614
3615 /*
3616  * [VF] Initializes Transmit Unit.
3617  */
3618 void
3619 ixgbevf_dev_tx_init(struct rte_eth_dev *dev)
3620 {
3621         struct ixgbe_hw     *hw;
3622         struct igb_tx_queue *txq;
3623         uint64_t bus_addr;
3624         uint32_t txctrl;
3625         uint16_t i;
3626
3627         PMD_INIT_FUNC_TRACE();
3628         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3629
3630         /* Setup the Base and Length of the Tx Descriptor Rings */
3631         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3632                 txq = dev->data->tx_queues[i];
3633                 bus_addr = txq->tx_ring_phys_addr;
3634                 IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(i),
3635                                 (uint32_t)(bus_addr & 0x00000000ffffffffULL));
3636                 IXGBE_WRITE_REG(hw, IXGBE_VFTDBAH(i),
3637                                 (uint32_t)(bus_addr >> 32));
3638                 IXGBE_WRITE_REG(hw, IXGBE_VFTDLEN(i),
3639                                 txq->nb_tx_desc * sizeof(union ixgbe_adv_tx_desc));
3640                 /* Setup the HW Tx Head and TX Tail descriptor pointers */
3641                 IXGBE_WRITE_REG(hw, IXGBE_VFTDH(i), 0);
3642                 IXGBE_WRITE_REG(hw, IXGBE_VFTDT(i), 0);
3643
3644                 /*
3645                  * Disable Tx Head Writeback RO bit, since this hoses
3646                  * bookkeeping if things aren't delivered in order.
3647                  */
3648                 txctrl = IXGBE_READ_REG(hw,
3649                                 IXGBE_VFDCA_TXCTRL(i));
3650                 txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
3651                 IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(i),
3652                                 txctrl);
3653         }
3654 }
3655
3656 /*
3657  * [VF] Start Transmit and Receive Units.
3658  */
3659 void
3660 ixgbevf_dev_rxtx_start(struct rte_eth_dev *dev)
3661 {
3662         struct ixgbe_hw     *hw;
3663         struct igb_tx_queue *txq;
3664         struct igb_rx_queue *rxq;
3665         uint32_t txdctl;
3666         uint32_t rxdctl;
3667         uint16_t i;
3668         int poll_ms;
3669
3670         PMD_INIT_FUNC_TRACE();
3671         hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
3672
3673         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3674                 txq = dev->data->tx_queues[i];
3675                 /* Setup Transmit Threshold Registers */
3676                 txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
3677                 txdctl |= txq->pthresh & 0x7F;
3678                 txdctl |= ((txq->hthresh & 0x7F) << 8);
3679                 txdctl |= ((txq->wthresh & 0x7F) << 16);
3680                 IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl);
3681         }
3682
3683         for (i = 0; i < dev->data->nb_tx_queues; i++) {
3684
3685                 txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
3686                 txdctl |= IXGBE_TXDCTL_ENABLE;
3687                 IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl);
3688
3689                 poll_ms = 10;
3690                 /* Wait until TX Enable ready */
3691                 do {
3692                         rte_delay_ms(1);
3693                         txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
3694                 } while (--poll_ms && !(txdctl & IXGBE_TXDCTL_ENABLE));
3695                 if (!poll_ms)
3696                         PMD_INIT_LOG(ERR, "Could not enable "
3697                                          "Tx Queue %d\n", i);
3698         }
3699         for (i = 0; i < dev->data->nb_rx_queues; i++) {
3700
3701                 rxq = dev->data->rx_queues[i];
3702
3703                 rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
3704                 rxdctl |= IXGBE_RXDCTL_ENABLE;
3705                 IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), rxdctl);
3706
3707                 /* Wait until RX Enable ready */
3708                 poll_ms = 10;
3709                 do {
3710                         rte_delay_ms(1);
3711                         rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
3712                 } while (--poll_ms && !(rxdctl & IXGBE_RXDCTL_ENABLE));
3713                 if (!poll_ms)
3714                         PMD_INIT_LOG(ERR, "Could not enable "
3715                                          "Rx Queue %d\n", i);
3716                 rte_wmb();
3717                 IXGBE_WRITE_REG(hw, IXGBE_VFRDT(i), rxq->nb_rx_desc - 1);
3718
3719         }
3720 }