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