net/qede/base: fix code flow and remove unused code
[dpdk.git] / drivers / net / qede / qede_rxtx.c
1 /*
2  * Copyright (c) 2016 QLogic Corporation.
3  * All rights reserved.
4  * www.qlogic.com
5  *
6  * See LICENSE.qede_pmd for copyright and licensing details.
7  */
8
9 #include <rte_net.h>
10 #include "qede_rxtx.h"
11
12 static inline int qede_alloc_rx_buffer(struct qede_rx_queue *rxq)
13 {
14         struct rte_mbuf *new_mb = NULL;
15         struct eth_rx_bd *rx_bd;
16         dma_addr_t mapping;
17         uint16_t idx = rxq->sw_rx_prod & NUM_RX_BDS(rxq);
18
19         new_mb = rte_mbuf_raw_alloc(rxq->mb_pool);
20         if (unlikely(!new_mb)) {
21                 PMD_RX_LOG(ERR, rxq,
22                            "Failed to allocate rx buffer "
23                            "sw_rx_prod %u sw_rx_cons %u mp entries %u free %u",
24                            idx, rxq->sw_rx_cons & NUM_RX_BDS(rxq),
25                            rte_mempool_avail_count(rxq->mb_pool),
26                            rte_mempool_in_use_count(rxq->mb_pool));
27                 return -ENOMEM;
28         }
29         rxq->sw_rx_ring[idx].mbuf = new_mb;
30         rxq->sw_rx_ring[idx].page_offset = 0;
31         mapping = rte_mbuf_data_dma_addr_default(new_mb);
32         /* Advance PROD and get BD pointer */
33         rx_bd = (struct eth_rx_bd *)ecore_chain_produce(&rxq->rx_bd_ring);
34         rx_bd->addr.hi = rte_cpu_to_le_32(U64_HI(mapping));
35         rx_bd->addr.lo = rte_cpu_to_le_32(U64_LO(mapping));
36         rxq->sw_rx_prod++;
37         return 0;
38 }
39
40 static void qede_rx_queue_release_mbufs(struct qede_rx_queue *rxq)
41 {
42         uint16_t i;
43
44         if (rxq->sw_rx_ring != NULL) {
45                 for (i = 0; i < rxq->nb_rx_desc; i++) {
46                         if (rxq->sw_rx_ring[i].mbuf != NULL) {
47                                 rte_pktmbuf_free(rxq->sw_rx_ring[i].mbuf);
48                                 rxq->sw_rx_ring[i].mbuf = NULL;
49                         }
50                 }
51         }
52 }
53
54 void qede_rx_queue_release(void *rx_queue)
55 {
56         struct qede_rx_queue *rxq = rx_queue;
57
58         if (rxq != NULL) {
59                 qede_rx_queue_release_mbufs(rxq);
60                 rte_free(rxq->sw_rx_ring);
61                 rxq->sw_rx_ring = NULL;
62                 rte_free(rxq);
63                 rxq = NULL;
64         }
65 }
66
67 static void qede_tx_queue_release_mbufs(struct qede_tx_queue *txq)
68 {
69         unsigned int i;
70
71         PMD_TX_LOG(DEBUG, txq, "releasing %u mbufs", txq->nb_tx_desc);
72
73         if (txq->sw_tx_ring) {
74                 for (i = 0; i < txq->nb_tx_desc; i++) {
75                         if (txq->sw_tx_ring[i].mbuf) {
76                                 rte_pktmbuf_free(txq->sw_tx_ring[i].mbuf);
77                                 txq->sw_tx_ring[i].mbuf = NULL;
78                         }
79                 }
80         }
81 }
82
83 int
84 qede_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx,
85                     uint16_t nb_desc, unsigned int socket_id,
86                     const struct rte_eth_rxconf *rx_conf,
87                     struct rte_mempool *mp)
88 {
89         struct qede_dev *qdev = dev->data->dev_private;
90         struct ecore_dev *edev = &qdev->edev;
91         struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
92         struct qede_rx_queue *rxq;
93         uint16_t max_rx_pkt_len;
94         uint16_t bufsz;
95         size_t size;
96         int rc;
97         int i;
98
99         PMD_INIT_FUNC_TRACE(edev);
100
101         /* Note: Ring size/align is controlled by struct rte_eth_desc_lim */
102         if (!rte_is_power_of_2(nb_desc)) {
103                 DP_ERR(edev, "Ring size %u is not power of 2\n",
104                           nb_desc);
105                 return -EINVAL;
106         }
107
108         /* Free memory prior to re-allocation if needed... */
109         if (dev->data->rx_queues[queue_idx] != NULL) {
110                 qede_rx_queue_release(dev->data->rx_queues[queue_idx]);
111                 dev->data->rx_queues[queue_idx] = NULL;
112         }
113
114         /* First allocate the rx queue data structure */
115         rxq = rte_zmalloc_socket("qede_rx_queue", sizeof(struct qede_rx_queue),
116                                  RTE_CACHE_LINE_SIZE, socket_id);
117
118         if (!rxq) {
119                 DP_ERR(edev, "Unable to allocate memory for rxq on socket %u",
120                           socket_id);
121                 return -ENOMEM;
122         }
123
124         rxq->qdev = qdev;
125         rxq->mb_pool = mp;
126         rxq->nb_rx_desc = nb_desc;
127         rxq->queue_id = queue_idx;
128         rxq->port_id = dev->data->port_id;
129         max_rx_pkt_len = (uint16_t)rxmode->max_rx_pkt_len;
130         qdev->mtu = max_rx_pkt_len;
131
132         /* Fix up RX buffer size */
133         bufsz = (uint16_t)rte_pktmbuf_data_room_size(mp) - RTE_PKTMBUF_HEADROOM;
134         if ((rxmode->enable_scatter)                    ||
135             (max_rx_pkt_len + QEDE_ETH_OVERHEAD) > bufsz) {
136                 if (!dev->data->scattered_rx) {
137                         DP_INFO(edev, "Forcing scatter-gather mode\n");
138                         dev->data->scattered_rx = 1;
139                 }
140         }
141         if (dev->data->scattered_rx)
142                 rxq->rx_buf_size = bufsz + QEDE_ETH_OVERHEAD;
143         else
144                 rxq->rx_buf_size = qdev->mtu + QEDE_ETH_OVERHEAD;
145         /* Align to cache-line size if needed */
146         rxq->rx_buf_size = QEDE_CEIL_TO_CACHE_LINE_SIZE(rxq->rx_buf_size);
147
148         DP_INFO(edev, "mtu %u mbufsz %u bd_max_bytes %u scatter_mode %d\n",
149                 qdev->mtu, bufsz, rxq->rx_buf_size, dev->data->scattered_rx);
150
151         /* Allocate the parallel driver ring for Rx buffers */
152         size = sizeof(*rxq->sw_rx_ring) * rxq->nb_rx_desc;
153         rxq->sw_rx_ring = rte_zmalloc_socket("sw_rx_ring", size,
154                                              RTE_CACHE_LINE_SIZE, socket_id);
155         if (!rxq->sw_rx_ring) {
156                 DP_NOTICE(edev, false,
157                           "Unable to alloc memory for sw_rx_ring on socket %u\n",
158                           socket_id);
159                 rte_free(rxq);
160                 rxq = NULL;
161                 return -ENOMEM;
162         }
163
164         /* Allocate FW Rx ring  */
165         rc = qdev->ops->common->chain_alloc(edev,
166                                             ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
167                                             ECORE_CHAIN_MODE_NEXT_PTR,
168                                             ECORE_CHAIN_CNT_TYPE_U16,
169                                             rxq->nb_rx_desc,
170                                             sizeof(struct eth_rx_bd),
171                                             &rxq->rx_bd_ring,
172                                             NULL);
173
174         if (rc != ECORE_SUCCESS) {
175                 DP_NOTICE(edev, false,
176                           "Unable to alloc memory for rxbd ring on socket %u\n",
177                           socket_id);
178                 rte_free(rxq->sw_rx_ring);
179                 rxq->sw_rx_ring = NULL;
180                 rte_free(rxq);
181                 rxq = NULL;
182                 return -ENOMEM;
183         }
184
185         /* Allocate FW completion ring */
186         rc = qdev->ops->common->chain_alloc(edev,
187                                             ECORE_CHAIN_USE_TO_CONSUME,
188                                             ECORE_CHAIN_MODE_PBL,
189                                             ECORE_CHAIN_CNT_TYPE_U16,
190                                             rxq->nb_rx_desc,
191                                             sizeof(union eth_rx_cqe),
192                                             &rxq->rx_comp_ring,
193                                             NULL);
194
195         if (rc != ECORE_SUCCESS) {
196                 DP_NOTICE(edev, false,
197                           "Unable to alloc memory for cqe ring on socket %u\n",
198                           socket_id);
199                 /* TBD: Freeing RX BD ring */
200                 rte_free(rxq->sw_rx_ring);
201                 rxq->sw_rx_ring = NULL;
202                 rte_free(rxq);
203                 return -ENOMEM;
204         }
205
206         /* Allocate buffers for the Rx ring */
207         for (i = 0; i < rxq->nb_rx_desc; i++) {
208                 rc = qede_alloc_rx_buffer(rxq);
209                 if (rc) {
210                         DP_NOTICE(edev, false,
211                                   "RX buffer allocation failed at idx=%d\n", i);
212                         goto err4;
213                 }
214         }
215
216         dev->data->rx_queues[queue_idx] = rxq;
217
218         DP_INFO(edev, "rxq %d num_desc %u rx_buf_size=%u socket %u\n",
219                   queue_idx, nb_desc, qdev->mtu, socket_id);
220
221         return 0;
222 err4:
223         qede_rx_queue_release(rxq);
224         return -ENOMEM;
225 }
226
227 void qede_tx_queue_release(void *tx_queue)
228 {
229         struct qede_tx_queue *txq = tx_queue;
230
231         if (txq != NULL) {
232                 qede_tx_queue_release_mbufs(txq);
233                 if (txq->sw_tx_ring) {
234                         rte_free(txq->sw_tx_ring);
235                         txq->sw_tx_ring = NULL;
236                 }
237                 rte_free(txq);
238         }
239         txq = NULL;
240 }
241
242 int
243 qede_tx_queue_setup(struct rte_eth_dev *dev,
244                     uint16_t queue_idx,
245                     uint16_t nb_desc,
246                     unsigned int socket_id,
247                     const struct rte_eth_txconf *tx_conf)
248 {
249         struct qede_dev *qdev = dev->data->dev_private;
250         struct ecore_dev *edev = &qdev->edev;
251         struct qede_tx_queue *txq;
252         int rc;
253
254         PMD_INIT_FUNC_TRACE(edev);
255
256         if (!rte_is_power_of_2(nb_desc)) {
257                 DP_ERR(edev, "Ring size %u is not power of 2\n",
258                        nb_desc);
259                 return -EINVAL;
260         }
261
262         /* Free memory prior to re-allocation if needed... */
263         if (dev->data->tx_queues[queue_idx] != NULL) {
264                 qede_tx_queue_release(dev->data->tx_queues[queue_idx]);
265                 dev->data->tx_queues[queue_idx] = NULL;
266         }
267
268         txq = rte_zmalloc_socket("qede_tx_queue", sizeof(struct qede_tx_queue),
269                                  RTE_CACHE_LINE_SIZE, socket_id);
270
271         if (txq == NULL) {
272                 DP_ERR(edev,
273                        "Unable to allocate memory for txq on socket %u",
274                        socket_id);
275                 return -ENOMEM;
276         }
277
278         txq->nb_tx_desc = nb_desc;
279         txq->qdev = qdev;
280         txq->port_id = dev->data->port_id;
281
282         rc = qdev->ops->common->chain_alloc(edev,
283                                             ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
284                                             ECORE_CHAIN_MODE_PBL,
285                                             ECORE_CHAIN_CNT_TYPE_U16,
286                                             txq->nb_tx_desc,
287                                             sizeof(union eth_tx_bd_types),
288                                             &txq->tx_pbl,
289                                             NULL);
290         if (rc != ECORE_SUCCESS) {
291                 DP_ERR(edev,
292                        "Unable to allocate memory for txbd ring on socket %u",
293                        socket_id);
294                 qede_tx_queue_release(txq);
295                 return -ENOMEM;
296         }
297
298         /* Allocate software ring */
299         txq->sw_tx_ring = rte_zmalloc_socket("txq->sw_tx_ring",
300                                              (sizeof(struct qede_tx_entry) *
301                                               txq->nb_tx_desc),
302                                              RTE_CACHE_LINE_SIZE, socket_id);
303
304         if (!txq->sw_tx_ring) {
305                 DP_ERR(edev,
306                        "Unable to allocate memory for txbd ring on socket %u",
307                        socket_id);
308                 qede_tx_queue_release(txq);
309                 return -ENOMEM;
310         }
311
312         txq->queue_id = queue_idx;
313
314         txq->nb_tx_avail = txq->nb_tx_desc;
315
316         txq->tx_free_thresh =
317             tx_conf->tx_free_thresh ? tx_conf->tx_free_thresh :
318             (txq->nb_tx_desc - QEDE_DEFAULT_TX_FREE_THRESH);
319
320         dev->data->tx_queues[queue_idx] = txq;
321
322         DP_INFO(edev,
323                   "txq %u num_desc %u tx_free_thresh %u socket %u\n",
324                   queue_idx, nb_desc, txq->tx_free_thresh, socket_id);
325
326         return 0;
327 }
328
329 /* This function inits fp content and resets the SB, RXQ and TXQ arrays */
330 static void qede_init_fp(struct qede_dev *qdev)
331 {
332         struct qede_fastpath *fp;
333         uint8_t i, rss_id, tc;
334         int fp_rx = qdev->fp_num_rx, rxq = 0, txq = 0;
335
336         memset((void *)qdev->fp_array, 0, (QEDE_QUEUE_CNT(qdev) *
337                                            sizeof(*qdev->fp_array)));
338         memset((void *)qdev->sb_array, 0, (QEDE_QUEUE_CNT(qdev) *
339                                            sizeof(*qdev->sb_array)));
340         for_each_queue(i) {
341                 fp = &qdev->fp_array[i];
342                 if (fp_rx) {
343                         fp->type = QEDE_FASTPATH_RX;
344                         fp_rx--;
345                 } else{
346                         fp->type = QEDE_FASTPATH_TX;
347                 }
348                 fp->qdev = qdev;
349                 fp->id = i;
350                 fp->sb_info = &qdev->sb_array[i];
351                 snprintf(fp->name, sizeof(fp->name), "%s-fp-%d", "qdev", i);
352         }
353
354 }
355
356 void qede_free_fp_arrays(struct qede_dev *qdev)
357 {
358         /* It asseumes qede_free_mem_load() is called before */
359         if (qdev->fp_array != NULL) {
360                 rte_free(qdev->fp_array);
361                 qdev->fp_array = NULL;
362         }
363
364         if (qdev->sb_array != NULL) {
365                 rte_free(qdev->sb_array);
366                 qdev->sb_array = NULL;
367         }
368 }
369
370 int qede_alloc_fp_array(struct qede_dev *qdev)
371 {
372         struct qede_fastpath *fp;
373         struct ecore_dev *edev = &qdev->edev;
374         int i;
375
376         qdev->fp_array = rte_calloc("fp", QEDE_QUEUE_CNT(qdev),
377                                     sizeof(*qdev->fp_array),
378                                     RTE_CACHE_LINE_SIZE);
379
380         if (!qdev->fp_array) {
381                 DP_ERR(edev, "fp array allocation failed\n");
382                 return -ENOMEM;
383         }
384
385         qdev->sb_array = rte_calloc("sb", QEDE_QUEUE_CNT(qdev),
386                                     sizeof(*qdev->sb_array),
387                                     RTE_CACHE_LINE_SIZE);
388
389         if (!qdev->sb_array) {
390                 DP_ERR(edev, "sb array allocation failed\n");
391                 rte_free(qdev->fp_array);
392                 return -ENOMEM;
393         }
394
395         return 0;
396 }
397
398 /* This function allocates fast-path status block memory */
399 static int
400 qede_alloc_mem_sb(struct qede_dev *qdev, struct ecore_sb_info *sb_info,
401                   uint16_t sb_id)
402 {
403         struct ecore_dev *edev = &qdev->edev;
404         struct status_block *sb_virt;
405         dma_addr_t sb_phys;
406         int rc;
407
408         sb_virt = OSAL_DMA_ALLOC_COHERENT(edev, &sb_phys, sizeof(*sb_virt));
409
410         if (!sb_virt) {
411                 DP_ERR(edev, "Status block allocation failed\n");
412                 return -ENOMEM;
413         }
414
415         rc = qdev->ops->common->sb_init(edev, sb_info,
416                                         sb_virt, sb_phys, sb_id,
417                                         QED_SB_TYPE_L2_QUEUE);
418         if (rc) {
419                 DP_ERR(edev, "Status block initialization failed\n");
420                 /* TBD: No dma_free_coherent possible */
421                 return rc;
422         }
423
424         return 0;
425 }
426
427 int qede_alloc_fp_resc(struct qede_dev *qdev)
428 {
429         struct ecore_dev *edev = &qdev->edev;
430         struct qede_fastpath *fp;
431         uint32_t num_sbs;
432         uint16_t i;
433         uint16_t sb_idx;
434         int rc;
435
436         if (IS_VF(edev))
437                 ecore_vf_get_num_sbs(ECORE_LEADING_HWFN(edev), &num_sbs);
438         else
439                 num_sbs = ecore_cxt_get_proto_cid_count
440                           (ECORE_LEADING_HWFN(edev), PROTOCOLID_ETH, NULL);
441
442         if (num_sbs == 0) {
443                 DP_ERR(edev, "No status blocks available\n");
444                 return -EINVAL;
445         }
446
447         if (qdev->fp_array)
448                 qede_free_fp_arrays(qdev);
449
450         rc = qede_alloc_fp_array(qdev);
451         if (rc != 0)
452                 return rc;
453
454         qede_init_fp(qdev);
455
456         for (i = 0; i < QEDE_QUEUE_CNT(qdev); i++) {
457                 fp = &qdev->fp_array[i];
458                 if (IS_VF(edev))
459                         sb_idx = i % num_sbs;
460                 else
461                         sb_idx = i;
462                 if (qede_alloc_mem_sb(qdev, fp->sb_info, sb_idx)) {
463                         qede_free_fp_arrays(qdev);
464                         return -ENOMEM;
465                 }
466         }
467
468         return 0;
469 }
470
471 void qede_dealloc_fp_resc(struct rte_eth_dev *eth_dev)
472 {
473         struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
474
475         qede_free_mem_load(eth_dev);
476         qede_free_fp_arrays(qdev);
477 }
478
479 static inline void
480 qede_update_rx_prod(struct qede_dev *edev, struct qede_rx_queue *rxq)
481 {
482         uint16_t bd_prod = ecore_chain_get_prod_idx(&rxq->rx_bd_ring);
483         uint16_t cqe_prod = ecore_chain_get_prod_idx(&rxq->rx_comp_ring);
484         struct eth_rx_prod_data rx_prods = { 0 };
485
486         /* Update producers */
487         rx_prods.bd_prod = rte_cpu_to_le_16(bd_prod);
488         rx_prods.cqe_prod = rte_cpu_to_le_16(cqe_prod);
489
490         /* Make sure that the BD and SGE data is updated before updating the
491          * producers since FW might read the BD/SGE right after the producer
492          * is updated.
493          */
494         rte_wmb();
495
496         internal_ram_wr(rxq->hw_rxq_prod_addr, sizeof(rx_prods),
497                         (uint32_t *)&rx_prods);
498
499         /* mmiowb is needed to synchronize doorbell writes from more than one
500          * processor. It guarantees that the write arrives to the device before
501          * the napi lock is released and another qede_poll is called (possibly
502          * on another CPU). Without this barrier, the next doorbell can bypass
503          * this doorbell. This is applicable to IA64/Altix systems.
504          */
505         rte_wmb();
506
507         PMD_RX_LOG(DEBUG, rxq, "bd_prod %u  cqe_prod %u", bd_prod, cqe_prod);
508 }
509
510 static void
511 qede_update_sge_tpa_params(struct ecore_sge_tpa_params *sge_tpa_params,
512                            uint16_t mtu, bool enable)
513 {
514         /* Enable LRO in split mode */
515         sge_tpa_params->tpa_ipv4_en_flg = enable;
516         sge_tpa_params->tpa_ipv6_en_flg = enable;
517         sge_tpa_params->tpa_ipv4_tunn_en_flg = false;
518         sge_tpa_params->tpa_ipv6_tunn_en_flg = false;
519         /* set if tpa enable changes */
520         sge_tpa_params->update_tpa_en_flg = 1;
521         /* set if tpa parameters should be handled */
522         sge_tpa_params->update_tpa_param_flg = enable;
523
524         sge_tpa_params->max_buffers_per_cqe = 20;
525         /* Enable TPA in split mode. In this mode each TPA segment
526          * starts on the new BD, so there is one BD per segment.
527          */
528         sge_tpa_params->tpa_pkt_split_flg = 1;
529         sge_tpa_params->tpa_hdr_data_split_flg = 0;
530         sge_tpa_params->tpa_gro_consistent_flg = 0;
531         sge_tpa_params->tpa_max_aggs_num = ETH_TPA_MAX_AGGS_NUM;
532         sge_tpa_params->tpa_max_size = 0x7FFF;
533         sge_tpa_params->tpa_min_size_to_start = mtu / 2;
534         sge_tpa_params->tpa_min_size_to_cont = mtu / 2;
535 }
536
537 static int qede_start_queues(struct rte_eth_dev *eth_dev, bool clear_stats)
538 {
539         struct qede_dev *qdev = eth_dev->data->dev_private;
540         struct ecore_dev *edev = &qdev->edev;
541         struct ecore_queue_start_common_params q_params;
542         struct qed_dev_info *qed_info = &qdev->dev_info.common;
543         struct qed_update_vport_params vport_update_params;
544         struct ecore_sge_tpa_params tpa_params;
545         struct qede_tx_queue *txq;
546         struct qede_fastpath *fp;
547         dma_addr_t p_phys_table;
548         int txq_index;
549         uint16_t page_cnt;
550         int vlan_removal_en = 1;
551         int rc, tc, i;
552
553         for_each_queue(i) {
554                 fp = &qdev->fp_array[i];
555                 if (fp->type & QEDE_FASTPATH_RX) {
556                         struct ecore_rxq_start_ret_params ret_params;
557
558                         p_phys_table =
559                             ecore_chain_get_pbl_phys(&fp->rxq->rx_comp_ring);
560                         page_cnt =
561                             ecore_chain_get_page_cnt(&fp->rxq->rx_comp_ring);
562
563                         memset(&ret_params, 0, sizeof(ret_params));
564                         memset(&q_params, 0, sizeof(q_params));
565                         q_params.queue_id = i;
566                         q_params.vport_id = 0;
567                         q_params.sb = fp->sb_info->igu_sb_id;
568                         q_params.sb_idx = RX_PI;
569
570                         ecore_sb_ack(fp->sb_info, IGU_INT_DISABLE, 0);
571
572                         rc = qdev->ops->q_rx_start(edev, i, &q_params,
573                                            fp->rxq->rx_buf_size,
574                                            fp->rxq->rx_bd_ring.p_phys_addr,
575                                            p_phys_table,
576                                            page_cnt,
577                                            &ret_params);
578                         if (rc) {
579                                 DP_ERR(edev, "Start rxq #%d failed %d\n",
580                                        fp->rxq->queue_id, rc);
581                                 return rc;
582                         }
583
584                         /* Use the return parameters */
585                         fp->rxq->hw_rxq_prod_addr = ret_params.p_prod;
586                         fp->rxq->handle = ret_params.p_handle;
587
588                         fp->rxq->hw_cons_ptr =
589                                         &fp->sb_info->sb_virt->pi_array[RX_PI];
590
591                         qede_update_rx_prod(qdev, fp->rxq);
592                 }
593
594                 if (!(fp->type & QEDE_FASTPATH_TX))
595                         continue;
596                 for (tc = 0; tc < qdev->num_tc; tc++) {
597                         struct ecore_txq_start_ret_params ret_params;
598
599                         txq = fp->txqs[tc];
600                         txq_index = tc * QEDE_RSS_COUNT(qdev) + i;
601
602                         p_phys_table = ecore_chain_get_pbl_phys(&txq->tx_pbl);
603                         page_cnt = ecore_chain_get_page_cnt(&txq->tx_pbl);
604
605                         memset(&q_params, 0, sizeof(q_params));
606                         memset(&ret_params, 0, sizeof(ret_params));
607                         q_params.queue_id = txq->queue_id;
608                         q_params.vport_id = 0;
609                         q_params.sb = fp->sb_info->igu_sb_id;
610                         q_params.sb_idx = TX_PI(tc);
611
612                         rc = qdev->ops->q_tx_start(edev, i, &q_params,
613                                                    p_phys_table,
614                                                    page_cnt, /* **pp_doorbell */
615                                                    &ret_params);
616                         if (rc) {
617                                 DP_ERR(edev, "Start txq %u failed %d\n",
618                                        txq_index, rc);
619                                 return rc;
620                         }
621
622                         txq->doorbell_addr = ret_params.p_doorbell;
623                         txq->handle = ret_params.p_handle;
624
625                         txq->hw_cons_ptr =
626                             &fp->sb_info->sb_virt->pi_array[TX_PI(tc)];
627                         SET_FIELD(txq->tx_db.data.params,
628                                   ETH_DB_DATA_DEST, DB_DEST_XCM);
629                         SET_FIELD(txq->tx_db.data.params, ETH_DB_DATA_AGG_CMD,
630                                   DB_AGG_CMD_SET);
631                         SET_FIELD(txq->tx_db.data.params,
632                                   ETH_DB_DATA_AGG_VAL_SEL,
633                                   DQ_XCM_ETH_TX_BD_PROD_CMD);
634
635                         txq->tx_db.data.agg_flags = DQ_XCM_ETH_DQ_CF_CMD;
636                 }
637         }
638
639         /* Prepare and send the vport enable */
640         memset(&vport_update_params, 0, sizeof(vport_update_params));
641         /* Update MTU via vport update */
642         vport_update_params.mtu = qdev->mtu;
643         vport_update_params.vport_id = 0;
644         vport_update_params.update_vport_active_flg = 1;
645         vport_update_params.vport_active_flg = 1;
646
647         /* @DPDK */
648         if (qed_info->mf_mode == MF_NPAR && qed_info->tx_switching) {
649                 /* TBD: Check SRIOV enabled for VF */
650                 vport_update_params.update_tx_switching_flg = 1;
651                 vport_update_params.tx_switching_flg = 1;
652         }
653
654         /* TPA */
655         if (qdev->enable_lro) {
656                 DP_INFO(edev, "Enabling LRO\n");
657                 memset(&tpa_params, 0, sizeof(struct ecore_sge_tpa_params));
658                 qede_update_sge_tpa_params(&tpa_params, qdev->mtu, true);
659                 vport_update_params.sge_tpa_params = &tpa_params;
660         }
661
662         rc = qdev->ops->vport_update(edev, &vport_update_params);
663         if (rc) {
664                 DP_ERR(edev, "Update V-PORT failed %d\n", rc);
665                 return rc;
666         }
667
668         return 0;
669 }
670
671 static bool qede_tunn_exist(uint16_t flag)
672 {
673         return !!((PARSING_AND_ERR_FLAGS_TUNNELEXIST_MASK <<
674                     PARSING_AND_ERR_FLAGS_TUNNELEXIST_SHIFT) & flag);
675 }
676
677 /*
678  * qede_check_tunn_csum_l4:
679  * Returns:
680  * 1 : If L4 csum is enabled AND if the validation has failed.
681  * 0 : Otherwise
682  */
683 static inline uint8_t qede_check_tunn_csum_l4(uint16_t flag)
684 {
685         if ((PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMWASCALCULATED_MASK <<
686              PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMWASCALCULATED_SHIFT) & flag)
687                 return !!((PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMERROR_MASK <<
688                         PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMERROR_SHIFT) & flag);
689
690         return 0;
691 }
692
693 static inline uint8_t qede_check_notunn_csum_l4(uint16_t flag)
694 {
695         if ((PARSING_AND_ERR_FLAGS_L4CHKSMWASCALCULATED_MASK <<
696              PARSING_AND_ERR_FLAGS_L4CHKSMWASCALCULATED_SHIFT) & flag)
697                 return !!((PARSING_AND_ERR_FLAGS_L4CHKSMERROR_MASK <<
698                            PARSING_AND_ERR_FLAGS_L4CHKSMERROR_SHIFT) & flag);
699
700         return 0;
701 }
702
703 static inline uint8_t
704 qede_check_notunn_csum_l3(struct rte_mbuf *m, uint16_t flag)
705 {
706         struct ipv4_hdr *ip;
707         uint16_t pkt_csum;
708         uint16_t calc_csum;
709         uint16_t val;
710
711         val = ((PARSING_AND_ERR_FLAGS_IPHDRERROR_MASK <<
712                 PARSING_AND_ERR_FLAGS_IPHDRERROR_SHIFT) & flag);
713
714         if (unlikely(val)) {
715                 m->packet_type = qede_rx_cqe_to_pkt_type(flag);
716                 if (RTE_ETH_IS_IPV4_HDR(m->packet_type)) {
717                         ip = rte_pktmbuf_mtod_offset(m, struct ipv4_hdr *,
718                                            sizeof(struct ether_hdr));
719                         pkt_csum = ip->hdr_checksum;
720                         ip->hdr_checksum = 0;
721                         calc_csum = rte_ipv4_cksum(ip);
722                         ip->hdr_checksum = pkt_csum;
723                         return (calc_csum != pkt_csum);
724                 } else if (RTE_ETH_IS_IPV6_HDR(m->packet_type)) {
725                         return 1;
726                 }
727         }
728         return 0;
729 }
730
731 static inline void qede_rx_bd_ring_consume(struct qede_rx_queue *rxq)
732 {
733         ecore_chain_consume(&rxq->rx_bd_ring);
734         rxq->sw_rx_cons++;
735 }
736
737 static inline void
738 qede_reuse_page(struct qede_dev *qdev,
739                 struct qede_rx_queue *rxq, struct qede_rx_entry *curr_cons)
740 {
741         struct eth_rx_bd *rx_bd_prod = ecore_chain_produce(&rxq->rx_bd_ring);
742         uint16_t idx = rxq->sw_rx_cons & NUM_RX_BDS(rxq);
743         struct qede_rx_entry *curr_prod;
744         dma_addr_t new_mapping;
745
746         curr_prod = &rxq->sw_rx_ring[idx];
747         *curr_prod = *curr_cons;
748
749         new_mapping = rte_mbuf_data_dma_addr_default(curr_prod->mbuf) +
750                       curr_prod->page_offset;
751
752         rx_bd_prod->addr.hi = rte_cpu_to_le_32(U64_HI(new_mapping));
753         rx_bd_prod->addr.lo = rte_cpu_to_le_32(U64_LO(new_mapping));
754
755         rxq->sw_rx_prod++;
756 }
757
758 static inline void
759 qede_recycle_rx_bd_ring(struct qede_rx_queue *rxq,
760                         struct qede_dev *qdev, uint8_t count)
761 {
762         struct qede_rx_entry *curr_cons;
763
764         for (; count > 0; count--) {
765                 curr_cons = &rxq->sw_rx_ring[rxq->sw_rx_cons & NUM_RX_BDS(rxq)];
766                 qede_reuse_page(qdev, rxq, curr_cons);
767                 qede_rx_bd_ring_consume(rxq);
768         }
769 }
770
771 static inline uint32_t qede_rx_cqe_to_pkt_type(uint16_t flags)
772 {
773         uint16_t val;
774
775         /* Lookup table */
776         static const uint32_t
777         ptype_lkup_tbl[QEDE_PKT_TYPE_MAX] __rte_cache_aligned = {
778                 [QEDE_PKT_TYPE_IPV4] = RTE_PTYPE_L3_IPV4,
779                 [QEDE_PKT_TYPE_IPV6] = RTE_PTYPE_L3_IPV6,
780                 [QEDE_PKT_TYPE_IPV4_TCP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_TCP,
781                 [QEDE_PKT_TYPE_IPV6_TCP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_TCP,
782                 [QEDE_PKT_TYPE_IPV4_UDP] = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_UDP,
783                 [QEDE_PKT_TYPE_IPV6_UDP] = RTE_PTYPE_L3_IPV6 | RTE_PTYPE_L4_UDP,
784         };
785
786         /* Bits (0..3) provides L3/L4 protocol type */
787         val = ((PARSING_AND_ERR_FLAGS_L3TYPE_MASK <<
788                PARSING_AND_ERR_FLAGS_L3TYPE_SHIFT) |
789                (PARSING_AND_ERR_FLAGS_L4PROTOCOL_MASK <<
790                 PARSING_AND_ERR_FLAGS_L4PROTOCOL_SHIFT)) & flags;
791
792         if (val < QEDE_PKT_TYPE_MAX)
793                 return ptype_lkup_tbl[val] | RTE_PTYPE_L2_ETHER;
794         else
795                 return RTE_PTYPE_UNKNOWN;
796 }
797
798 static inline void
799 qede_rx_process_tpa_cmn_cont_end_cqe(struct qede_dev *qdev,
800                                      struct qede_rx_queue *rxq,
801                                      uint8_t agg_index, uint16_t len)
802 {
803         struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
804         struct qede_agg_info *tpa_info;
805         struct rte_mbuf *curr_frag; /* Pointer to currently filled TPA seg */
806         uint16_t cons_idx;
807
808         /* Under certain conditions it is possible that FW may not consume
809          * additional or new BD. So decision to consume the BD must be made
810          * based on len_list[0].
811          */
812         if (rte_le_to_cpu_16(len)) {
813                 tpa_info = &rxq->tpa_info[agg_index];
814                 cons_idx = rxq->sw_rx_cons & NUM_RX_BDS(rxq);
815                 curr_frag = rxq->sw_rx_ring[cons_idx].mbuf;
816                 assert(curr_frag);
817                 curr_frag->nb_segs = 1;
818                 curr_frag->pkt_len = rte_le_to_cpu_16(len);
819                 curr_frag->data_len = curr_frag->pkt_len;
820                 tpa_info->tpa_tail->next = curr_frag;
821                 tpa_info->tpa_tail = curr_frag;
822                 qede_rx_bd_ring_consume(rxq);
823                 if (unlikely(qede_alloc_rx_buffer(rxq) != 0)) {
824                         PMD_RX_LOG(ERR, rxq, "mbuf allocation fails\n");
825                         rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++;
826                         rxq->rx_alloc_errors++;
827                 }
828         }
829 }
830
831 static inline void
832 qede_rx_process_tpa_cont_cqe(struct qede_dev *qdev,
833                              struct qede_rx_queue *rxq,
834                              struct eth_fast_path_rx_tpa_cont_cqe *cqe)
835 {
836         PMD_RX_LOG(INFO, rxq, "TPA cont[%d] - len [%d]\n",
837                    cqe->tpa_agg_index, rte_le_to_cpu_16(cqe->len_list[0]));
838         /* only len_list[0] will have value */
839         qede_rx_process_tpa_cmn_cont_end_cqe(qdev, rxq, cqe->tpa_agg_index,
840                                              cqe->len_list[0]);
841 }
842
843 static inline void
844 qede_rx_process_tpa_end_cqe(struct qede_dev *qdev,
845                             struct qede_rx_queue *rxq,
846                             struct eth_fast_path_rx_tpa_end_cqe *cqe)
847 {
848         struct qede_agg_info *tpa_info;
849         struct rte_mbuf *rx_mb; /* Pointer to head of the chained agg */
850
851         qede_rx_process_tpa_cmn_cont_end_cqe(qdev, rxq, cqe->tpa_agg_index,
852                                              cqe->len_list[0]);
853         /* Update total length and frags based on end TPA */
854         tpa_info = &rxq->tpa_info[cqe->tpa_agg_index];
855         rx_mb = rxq->tpa_info[cqe->tpa_agg_index].tpa_head;
856         /* TODO:  Add Sanity Checks */
857         rx_mb->nb_segs = cqe->num_of_bds;
858         rx_mb->pkt_len = cqe->total_packet_len;
859
860         PMD_RX_LOG(INFO, rxq, "TPA End[%d] reason %d cqe_len %d nb_segs %d"
861                    " pkt_len %d\n", cqe->tpa_agg_index, cqe->end_reason,
862                    rte_le_to_cpu_16(cqe->len_list[0]), rx_mb->nb_segs,
863                    rx_mb->pkt_len);
864 }
865
866 static inline uint32_t qede_rx_cqe_to_tunn_pkt_type(uint16_t flags)
867 {
868         uint32_t val;
869
870         /* Lookup table */
871         static const uint32_t
872         ptype_tunn_lkup_tbl[QEDE_PKT_TYPE_TUNN_MAX_TYPE] __rte_cache_aligned = {
873                 [QEDE_PKT_TYPE_UNKNOWN] = RTE_PTYPE_UNKNOWN,
874                 [QEDE_PKT_TYPE_TUNN_GENEVE] = RTE_PTYPE_TUNNEL_GENEVE,
875                 [QEDE_PKT_TYPE_TUNN_GRE] = RTE_PTYPE_TUNNEL_GRE,
876                 [QEDE_PKT_TYPE_TUNN_VXLAN] = RTE_PTYPE_TUNNEL_VXLAN,
877                 [QEDE_PKT_TYPE_TUNN_L2_TENID_NOEXIST_GENEVE] =
878                                 RTE_PTYPE_TUNNEL_GENEVE | RTE_PTYPE_L2_ETHER,
879                 [QEDE_PKT_TYPE_TUNN_L2_TENID_NOEXIST_GRE] =
880                                 RTE_PTYPE_TUNNEL_GRE | RTE_PTYPE_L2_ETHER,
881                 [QEDE_PKT_TYPE_TUNN_L2_TENID_NOEXIST_VXLAN] =
882                                 RTE_PTYPE_TUNNEL_VXLAN | RTE_PTYPE_L2_ETHER,
883                 [QEDE_PKT_TYPE_TUNN_L2_TENID_EXIST_GENEVE] =
884                                 RTE_PTYPE_TUNNEL_GENEVE | RTE_PTYPE_L2_ETHER,
885                 [QEDE_PKT_TYPE_TUNN_L2_TENID_EXIST_GRE] =
886                                 RTE_PTYPE_TUNNEL_GRE | RTE_PTYPE_L2_ETHER,
887                 [QEDE_PKT_TYPE_TUNN_L2_TENID_EXIST_VXLAN] =
888                                 RTE_PTYPE_TUNNEL_VXLAN | RTE_PTYPE_L2_ETHER,
889                 [QEDE_PKT_TYPE_TUNN_IPV4_TENID_NOEXIST_GENEVE] =
890                                 RTE_PTYPE_TUNNEL_GENEVE | RTE_PTYPE_L3_IPV4,
891                 [QEDE_PKT_TYPE_TUNN_IPV4_TENID_NOEXIST_GRE] =
892                                 RTE_PTYPE_TUNNEL_GRE | RTE_PTYPE_L3_IPV4,
893                 [QEDE_PKT_TYPE_TUNN_IPV4_TENID_NOEXIST_VXLAN] =
894                                 RTE_PTYPE_TUNNEL_VXLAN | RTE_PTYPE_L3_IPV4,
895                 [QEDE_PKT_TYPE_TUNN_IPV4_TENID_EXIST_GENEVE] =
896                                 RTE_PTYPE_TUNNEL_GENEVE | RTE_PTYPE_L3_IPV4,
897                 [QEDE_PKT_TYPE_TUNN_IPV4_TENID_EXIST_GRE] =
898                                 RTE_PTYPE_TUNNEL_GRE | RTE_PTYPE_L3_IPV4,
899                 [QEDE_PKT_TYPE_TUNN_IPV4_TENID_EXIST_VXLAN] =
900                                 RTE_PTYPE_TUNNEL_VXLAN | RTE_PTYPE_L3_IPV4,
901                 [QEDE_PKT_TYPE_TUNN_IPV6_TENID_NOEXIST_GENEVE] =
902                                 RTE_PTYPE_TUNNEL_GENEVE | RTE_PTYPE_L3_IPV6,
903                 [QEDE_PKT_TYPE_TUNN_IPV6_TENID_NOEXIST_GRE] =
904                                 RTE_PTYPE_TUNNEL_GRE | RTE_PTYPE_L3_IPV6,
905                 [QEDE_PKT_TYPE_TUNN_IPV6_TENID_NOEXIST_VXLAN] =
906                                 RTE_PTYPE_TUNNEL_VXLAN | RTE_PTYPE_L3_IPV6,
907                 [QEDE_PKT_TYPE_TUNN_IPV6_TENID_EXIST_GENEVE] =
908                                 RTE_PTYPE_TUNNEL_GENEVE | RTE_PTYPE_L3_IPV6,
909                 [QEDE_PKT_TYPE_TUNN_IPV6_TENID_EXIST_GRE] =
910                                 RTE_PTYPE_TUNNEL_GRE | RTE_PTYPE_L3_IPV6,
911                 [QEDE_PKT_TYPE_TUNN_IPV6_TENID_EXIST_VXLAN] =
912                                 RTE_PTYPE_TUNNEL_VXLAN | RTE_PTYPE_L3_IPV6,
913         };
914
915         /* Cover bits[4-0] to include tunn_type and next protocol */
916         val = ((ETH_TUNNEL_PARSING_FLAGS_TYPE_MASK <<
917                 ETH_TUNNEL_PARSING_FLAGS_TYPE_SHIFT) |
918                 (ETH_TUNNEL_PARSING_FLAGS_NEXT_PROTOCOL_MASK <<
919                 ETH_TUNNEL_PARSING_FLAGS_NEXT_PROTOCOL_SHIFT)) & flags;
920
921         if (val < QEDE_PKT_TYPE_TUNN_MAX_TYPE)
922                 return ptype_tunn_lkup_tbl[val];
923         else
924                 return RTE_PTYPE_UNKNOWN;
925 }
926
927 static inline int
928 qede_process_sg_pkts(void *p_rxq,  struct rte_mbuf *rx_mb,
929                      uint8_t num_segs, uint16_t pkt_len)
930 {
931         struct qede_rx_queue *rxq = p_rxq;
932         struct qede_dev *qdev = rxq->qdev;
933         struct ecore_dev *edev = &qdev->edev;
934         register struct rte_mbuf *seg1 = NULL;
935         register struct rte_mbuf *seg2 = NULL;
936         uint16_t sw_rx_index;
937         uint16_t cur_size;
938
939         seg1 = rx_mb;
940         while (num_segs) {
941                 cur_size = pkt_len > rxq->rx_buf_size ? rxq->rx_buf_size :
942                                                         pkt_len;
943                 if (unlikely(!cur_size)) {
944                         PMD_RX_LOG(ERR, rxq, "Length is 0 while %u BDs"
945                                    " left for mapping jumbo", num_segs);
946                         qede_recycle_rx_bd_ring(rxq, qdev, num_segs);
947                         return -EINVAL;
948                 }
949                 sw_rx_index = rxq->sw_rx_cons & NUM_RX_BDS(rxq);
950                 seg2 = rxq->sw_rx_ring[sw_rx_index].mbuf;
951                 qede_rx_bd_ring_consume(rxq);
952                 pkt_len -= cur_size;
953                 seg2->data_len = cur_size;
954                 seg1->next = seg2;
955                 seg1 = seg1->next;
956                 num_segs--;
957                 rxq->rx_segs++;
958         }
959
960         return 0;
961 }
962
963 uint16_t
964 qede_recv_pkts(void *p_rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
965 {
966         struct qede_rx_queue *rxq = p_rxq;
967         struct qede_dev *qdev = rxq->qdev;
968         struct ecore_dev *edev = &qdev->edev;
969         struct qede_fastpath *fp = &qdev->fp_array[rxq->queue_id];
970         uint16_t hw_comp_cons, sw_comp_cons, sw_rx_index;
971         uint16_t rx_pkt = 0;
972         union eth_rx_cqe *cqe;
973         struct eth_fast_path_rx_reg_cqe *fp_cqe;
974         register struct rte_mbuf *rx_mb = NULL;
975         register struct rte_mbuf *seg1 = NULL;
976         enum eth_rx_cqe_type cqe_type;
977         uint16_t pkt_len; /* Sum of all BD segments */
978         uint16_t len; /* Length of first BD */
979         uint8_t num_segs = 1;
980         uint16_t preload_idx;
981         uint8_t csum_flag;
982         uint16_t parse_flag;
983         enum rss_hash_type htype;
984         uint8_t tunn_parse_flag;
985         uint8_t j;
986         struct eth_fast_path_rx_tpa_start_cqe *cqe_start_tpa;
987         uint64_t ol_flags;
988         uint32_t packet_type;
989         uint16_t vlan_tci;
990         bool tpa_start_flg;
991         uint8_t bitfield_val;
992         uint8_t offset, tpa_agg_idx, flags;
993         struct qede_agg_info *tpa_info;
994         uint32_t rss_hash;
995
996         hw_comp_cons = rte_le_to_cpu_16(*rxq->hw_cons_ptr);
997         sw_comp_cons = ecore_chain_get_cons_idx(&rxq->rx_comp_ring);
998
999         rte_rmb();
1000
1001         if (hw_comp_cons == sw_comp_cons)
1002                 return 0;
1003
1004         while (sw_comp_cons != hw_comp_cons) {
1005                 ol_flags = 0;
1006                 packet_type = RTE_PTYPE_UNKNOWN;
1007                 vlan_tci = 0;
1008                 tpa_start_flg = false;
1009                 rss_hash = 0;
1010
1011                 /* Get the CQE from the completion ring */
1012                 cqe =
1013                     (union eth_rx_cqe *)ecore_chain_consume(&rxq->rx_comp_ring);
1014                 cqe_type = cqe->fast_path_regular.type;
1015                 PMD_RX_LOG(INFO, rxq, "Rx CQE type %d\n", cqe_type);
1016
1017                 switch (cqe_type) {
1018                 case ETH_RX_CQE_TYPE_REGULAR:
1019                         fp_cqe = &cqe->fast_path_regular;
1020                 break;
1021                 case ETH_RX_CQE_TYPE_TPA_START:
1022                         cqe_start_tpa = &cqe->fast_path_tpa_start;
1023                         tpa_info = &rxq->tpa_info[cqe_start_tpa->tpa_agg_index];
1024                         tpa_start_flg = true;
1025                         /* Mark it as LRO packet */
1026                         ol_flags |= PKT_RX_LRO;
1027                         /* In split mode,  seg_len is same as len_on_first_bd
1028                          * and ext_bd_len_list will be empty since there are
1029                          * no additional buffers
1030                          */
1031                         PMD_RX_LOG(INFO, rxq,
1032                             "TPA start[%d] - len_on_first_bd %d header %d"
1033                             " [bd_list[0] %d], [seg_len %d]\n",
1034                             cqe_start_tpa->tpa_agg_index,
1035                             rte_le_to_cpu_16(cqe_start_tpa->len_on_first_bd),
1036                             cqe_start_tpa->header_len,
1037                             rte_le_to_cpu_16(cqe_start_tpa->ext_bd_len_list[0]),
1038                             rte_le_to_cpu_16(cqe_start_tpa->seg_len));
1039
1040                 break;
1041                 case ETH_RX_CQE_TYPE_TPA_CONT:
1042                         qede_rx_process_tpa_cont_cqe(qdev, rxq,
1043                                                      &cqe->fast_path_tpa_cont);
1044                         goto next_cqe;
1045                 case ETH_RX_CQE_TYPE_TPA_END:
1046                         qede_rx_process_tpa_end_cqe(qdev, rxq,
1047                                                     &cqe->fast_path_tpa_end);
1048                         tpa_agg_idx = cqe->fast_path_tpa_end.tpa_agg_index;
1049                         tpa_info = &rxq->tpa_info[tpa_agg_idx];
1050                         rx_mb = rxq->tpa_info[tpa_agg_idx].tpa_head;
1051                         goto tpa_end;
1052                 case ETH_RX_CQE_TYPE_SLOW_PATH:
1053                         PMD_RX_LOG(INFO, rxq, "Got unexpected slowpath CQE\n");
1054                         qdev->ops->eth_cqe_completion(edev, fp->id,
1055                                 (struct eth_slow_path_rx_cqe *)cqe);
1056                         /* fall-thru */
1057                 default:
1058                         goto next_cqe;
1059                 }
1060
1061                 /* Get the data from the SW ring */
1062                 sw_rx_index = rxq->sw_rx_cons & NUM_RX_BDS(rxq);
1063                 rx_mb = rxq->sw_rx_ring[sw_rx_index].mbuf;
1064                 assert(rx_mb != NULL);
1065
1066                 /* Handle regular CQE or TPA start CQE */
1067                 if (!tpa_start_flg) {
1068                         parse_flag = rte_le_to_cpu_16(fp_cqe->pars_flags.flags);
1069                         bitfield_val = fp_cqe->bitfields;
1070                         offset = fp_cqe->placement_offset;
1071                         len = rte_le_to_cpu_16(fp_cqe->len_on_first_bd);
1072                         pkt_len = rte_le_to_cpu_16(fp_cqe->pkt_len);
1073                         vlan_tci = rte_le_to_cpu_16(fp_cqe->vlan_tag);
1074                         rss_hash = rte_le_to_cpu_32(fp_cqe->rss_hash);
1075                         htype = (uint8_t)GET_FIELD(bitfield_val,
1076                                         ETH_FAST_PATH_RX_REG_CQE_RSS_HASH_TYPE);
1077                 } else {
1078                         parse_flag =
1079                             rte_le_to_cpu_16(cqe_start_tpa->pars_flags.flags);
1080                         bitfield_val = cqe_start_tpa->bitfields;
1081                         offset = cqe_start_tpa->placement_offset;
1082                         /* seg_len = len_on_first_bd */
1083                         len = rte_le_to_cpu_16(cqe_start_tpa->len_on_first_bd);
1084                         vlan_tci = rte_le_to_cpu_16(cqe_start_tpa->vlan_tag);
1085                         htype = (uint8_t)GET_FIELD(bitfield_val,
1086                                 ETH_FAST_PATH_RX_TPA_START_CQE_RSS_HASH_TYPE);
1087                         rss_hash = rte_le_to_cpu_32(cqe_start_tpa->rss_hash);
1088                 }
1089                 if (qede_tunn_exist(parse_flag)) {
1090                         PMD_RX_LOG(INFO, rxq, "Rx tunneled packet\n");
1091                         if (unlikely(qede_check_tunn_csum_l4(parse_flag))) {
1092                                 PMD_RX_LOG(ERR, rxq,
1093                                             "L4 csum failed, flags = 0x%x\n",
1094                                             parse_flag);
1095                                 rxq->rx_hw_errors++;
1096                                 ol_flags |= PKT_RX_L4_CKSUM_BAD;
1097                         } else {
1098                                 ol_flags |= PKT_RX_L4_CKSUM_GOOD;
1099                                 if (tpa_start_flg)
1100                                         flags =
1101                                          cqe_start_tpa->tunnel_pars_flags.flags;
1102                                 else
1103                                         flags = fp_cqe->tunnel_pars_flags.flags;
1104                                 tunn_parse_flag = flags;
1105                                 packet_type =
1106                                 qede_rx_cqe_to_tunn_pkt_type(tunn_parse_flag);
1107                         }
1108                 } else {
1109                         PMD_RX_LOG(INFO, rxq, "Rx non-tunneled packet\n");
1110                         if (unlikely(qede_check_notunn_csum_l4(parse_flag))) {
1111                                 PMD_RX_LOG(ERR, rxq,
1112                                             "L4 csum failed, flags = 0x%x\n",
1113                                             parse_flag);
1114                                 rxq->rx_hw_errors++;
1115                                 ol_flags |= PKT_RX_L4_CKSUM_BAD;
1116                         } else {
1117                                 ol_flags |= PKT_RX_L4_CKSUM_GOOD;
1118                         }
1119                         if (unlikely(qede_check_notunn_csum_l3(rx_mb,
1120                                                         parse_flag))) {
1121                                 PMD_RX_LOG(ERR, rxq,
1122                                            "IP csum failed, flags = 0x%x\n",
1123                                            parse_flag);
1124                                 rxq->rx_hw_errors++;
1125                                 ol_flags |= PKT_RX_IP_CKSUM_BAD;
1126                         } else {
1127                                 ol_flags |= PKT_RX_IP_CKSUM_GOOD;
1128                                 packet_type =
1129                                         qede_rx_cqe_to_pkt_type(parse_flag);
1130                         }
1131                 }
1132
1133                 if (CQE_HAS_VLAN(parse_flag)) {
1134                         ol_flags |= PKT_RX_VLAN_PKT;
1135                         if (qdev->vlan_strip_flg) {
1136                                 ol_flags |= PKT_RX_VLAN_STRIPPED;
1137                                 rx_mb->vlan_tci = vlan_tci;
1138                         }
1139                 }
1140                 if (CQE_HAS_OUTER_VLAN(parse_flag)) {
1141                         ol_flags |= PKT_RX_QINQ_PKT;
1142                         if (qdev->vlan_strip_flg) {
1143                                 rx_mb->vlan_tci = vlan_tci;
1144                                 ol_flags |= PKT_RX_QINQ_STRIPPED;
1145                         }
1146                         rx_mb->vlan_tci_outer = 0;
1147                 }
1148                 /* RSS Hash */
1149                 if (qdev->rss_enable) {
1150                         ol_flags |= PKT_RX_RSS_HASH;
1151                         rx_mb->hash.rss = rss_hash;
1152                 }
1153
1154                 if (unlikely(qede_alloc_rx_buffer(rxq) != 0)) {
1155                         PMD_RX_LOG(ERR, rxq,
1156                                    "New buffer allocation failed,"
1157                                    "dropping incoming packet\n");
1158                         qede_recycle_rx_bd_ring(rxq, qdev, fp_cqe->bd_num);
1159                         rte_eth_devices[rxq->port_id].
1160                             data->rx_mbuf_alloc_failed++;
1161                         rxq->rx_alloc_errors++;
1162                         break;
1163                 }
1164                 qede_rx_bd_ring_consume(rxq);
1165
1166                 if (!tpa_start_flg && fp_cqe->bd_num > 1) {
1167                         PMD_RX_LOG(DEBUG, rxq, "Jumbo-over-BD packet: %02x BDs"
1168                                    " len on first: %04x Total Len: %04x",
1169                                    fp_cqe->bd_num, len, pkt_len);
1170                         num_segs = fp_cqe->bd_num - 1;
1171                         seg1 = rx_mb;
1172                         if (qede_process_sg_pkts(p_rxq, seg1, num_segs,
1173                                                  pkt_len - len))
1174                                 goto next_cqe;
1175                         for (j = 0; j < num_segs; j++) {
1176                                 if (qede_alloc_rx_buffer(rxq)) {
1177                                         PMD_RX_LOG(ERR, rxq,
1178                                                 "Buffer allocation failed");
1179                                         rte_eth_devices[rxq->port_id].
1180                                                 data->rx_mbuf_alloc_failed++;
1181                                         rxq->rx_alloc_errors++;
1182                                         break;
1183                                 }
1184                                 rxq->rx_segs++;
1185                         }
1186                 }
1187                 rxq->rx_segs++; /* for the first segment */
1188
1189                 /* Prefetch next mbuf while processing current one. */
1190                 preload_idx = rxq->sw_rx_cons & NUM_RX_BDS(rxq);
1191                 rte_prefetch0(rxq->sw_rx_ring[preload_idx].mbuf);
1192
1193                 /* Update rest of the MBUF fields */
1194                 rx_mb->data_off = offset + RTE_PKTMBUF_HEADROOM;
1195                 rx_mb->port = rxq->port_id;
1196                 rx_mb->ol_flags = ol_flags;
1197                 rx_mb->data_len = len;
1198                 rx_mb->packet_type = packet_type;
1199                 PMD_RX_LOG(INFO, rxq,
1200                            "pkt_type 0x%04x len %u hash_type %d hash_val 0x%x"
1201                            " ol_flags 0x%04lx\n",
1202                            packet_type, len, htype, rx_mb->hash.rss,
1203                            (unsigned long)ol_flags);
1204                 if (!tpa_start_flg) {
1205                         rx_mb->nb_segs = fp_cqe->bd_num;
1206                         rx_mb->pkt_len = pkt_len;
1207                 } else {
1208                         /* store ref to the updated mbuf */
1209                         tpa_info->tpa_head = rx_mb;
1210                         tpa_info->tpa_tail = tpa_info->tpa_head;
1211                 }
1212                 rte_prefetch1(rte_pktmbuf_mtod(rx_mb, void *));
1213 tpa_end:
1214                 if (!tpa_start_flg) {
1215                         rx_pkts[rx_pkt] = rx_mb;
1216                         rx_pkt++;
1217                 }
1218 next_cqe:
1219                 ecore_chain_recycle_consumed(&rxq->rx_comp_ring);
1220                 sw_comp_cons = ecore_chain_get_cons_idx(&rxq->rx_comp_ring);
1221                 if (rx_pkt == nb_pkts) {
1222                         PMD_RX_LOG(DEBUG, rxq,
1223                                    "Budget reached nb_pkts=%u received=%u",
1224                                    rx_pkt, nb_pkts);
1225                         break;
1226                 }
1227         }
1228
1229         qede_update_rx_prod(qdev, rxq);
1230
1231         rxq->rcv_pkts += rx_pkt;
1232
1233         PMD_RX_LOG(DEBUG, rxq, "rx_pkts=%u core=%d", rx_pkt, rte_lcore_id());
1234
1235         return rx_pkt;
1236 }
1237
1238 static inline void
1239 qede_free_tx_pkt(struct qede_tx_queue *txq)
1240 {
1241         struct rte_mbuf *mbuf;
1242         uint16_t nb_segs;
1243         uint16_t idx;
1244         uint8_t nbds;
1245
1246         idx = TX_CONS(txq);
1247         mbuf = txq->sw_tx_ring[idx].mbuf;
1248         if (mbuf) {
1249                 nb_segs = mbuf->nb_segs;
1250                 PMD_TX_LOG(DEBUG, txq, "nb_segs to free %u\n", nb_segs);
1251                 while (nb_segs) {
1252                         /* It's like consuming rxbuf in recv() */
1253                         ecore_chain_consume(&txq->tx_pbl);
1254                         txq->nb_tx_avail++;
1255                         nb_segs--;
1256                 }
1257                 rte_pktmbuf_free(mbuf);
1258                 txq->sw_tx_ring[idx].mbuf = NULL;
1259                 txq->sw_tx_cons++;
1260                 PMD_TX_LOG(DEBUG, txq, "Freed tx packet\n");
1261         } else {
1262                 ecore_chain_consume(&txq->tx_pbl);
1263                 txq->nb_tx_avail++;
1264         }
1265 }
1266
1267 static inline void
1268 qede_process_tx_compl(struct ecore_dev *edev, struct qede_tx_queue *txq)
1269 {
1270         uint16_t hw_bd_cons;
1271         uint16_t sw_tx_cons;
1272
1273         rte_compiler_barrier();
1274         hw_bd_cons = rte_le_to_cpu_16(*txq->hw_cons_ptr);
1275         sw_tx_cons = ecore_chain_get_cons_idx(&txq->tx_pbl);
1276         PMD_TX_LOG(DEBUG, txq, "Tx Completions = %u\n",
1277                    abs(hw_bd_cons - sw_tx_cons));
1278         while (hw_bd_cons !=  ecore_chain_get_cons_idx(&txq->tx_pbl))
1279                 qede_free_tx_pkt(txq);
1280 }
1281
1282 /* Populate scatter gather buffer descriptor fields */
1283 static inline uint8_t
1284 qede_encode_sg_bd(struct qede_tx_queue *p_txq, struct rte_mbuf *m_seg,
1285                   struct eth_tx_2nd_bd **bd2, struct eth_tx_3rd_bd **bd3)
1286 {
1287         struct qede_tx_queue *txq = p_txq;
1288         struct eth_tx_bd *tx_bd = NULL;
1289         dma_addr_t mapping;
1290         uint8_t nb_segs = 0;
1291
1292         /* Check for scattered buffers */
1293         while (m_seg) {
1294                 if (nb_segs == 0) {
1295                         if (!*bd2) {
1296                                 *bd2 = (struct eth_tx_2nd_bd *)
1297                                         ecore_chain_produce(&txq->tx_pbl);
1298                                 memset(*bd2, 0, sizeof(struct eth_tx_2nd_bd));
1299                                 nb_segs++;
1300                         }
1301                         mapping = rte_mbuf_data_dma_addr(m_seg);
1302                         QEDE_BD_SET_ADDR_LEN(*bd2, mapping, m_seg->data_len);
1303                         PMD_TX_LOG(DEBUG, txq, "BD2 len %04x", m_seg->data_len);
1304                 } else if (nb_segs == 1) {
1305                         if (!*bd3) {
1306                                 *bd3 = (struct eth_tx_3rd_bd *)
1307                                         ecore_chain_produce(&txq->tx_pbl);
1308                                 memset(*bd3, 0, sizeof(struct eth_tx_3rd_bd));
1309                                 nb_segs++;
1310                         }
1311                         mapping = rte_mbuf_data_dma_addr(m_seg);
1312                         QEDE_BD_SET_ADDR_LEN(*bd3, mapping, m_seg->data_len);
1313                         PMD_TX_LOG(DEBUG, txq, "BD3 len %04x", m_seg->data_len);
1314                 } else {
1315                         tx_bd = (struct eth_tx_bd *)
1316                                 ecore_chain_produce(&txq->tx_pbl);
1317                         memset(tx_bd, 0, sizeof(*tx_bd));
1318                         nb_segs++;
1319                         mapping = rte_mbuf_data_dma_addr(m_seg);
1320                         QEDE_BD_SET_ADDR_LEN(tx_bd, mapping, m_seg->data_len);
1321                         PMD_TX_LOG(DEBUG, txq, "BD len %04x", m_seg->data_len);
1322                 }
1323                 m_seg = m_seg->next;
1324         }
1325
1326         /* Return total scattered buffers */
1327         return nb_segs;
1328 }
1329
1330 #ifdef RTE_LIBRTE_QEDE_DEBUG_TX
1331 static inline void
1332 print_tx_bd_info(struct qede_tx_queue *txq,
1333                  struct eth_tx_1st_bd *bd1,
1334                  struct eth_tx_2nd_bd *bd2,
1335                  struct eth_tx_3rd_bd *bd3,
1336                  uint64_t tx_ol_flags)
1337 {
1338         char ol_buf[256] = { 0 }; /* for verbose prints */
1339
1340         if (bd1)
1341                 PMD_TX_LOG(INFO, txq,
1342                            "BD1: nbytes=%u nbds=%u bd_flags=04%x bf=%04x",
1343                            rte_cpu_to_le_16(bd1->nbytes), bd1->data.nbds,
1344                            bd1->data.bd_flags.bitfields,
1345                            rte_cpu_to_le_16(bd1->data.bitfields));
1346         if (bd2)
1347                 PMD_TX_LOG(INFO, txq,
1348                            "BD2: nbytes=%u bf=%04x\n",
1349                            rte_cpu_to_le_16(bd2->nbytes), bd2->data.bitfields1);
1350         if (bd3)
1351                 PMD_TX_LOG(INFO, txq,
1352                            "BD3: nbytes=%u bf=%04x mss=%u\n",
1353                            rte_cpu_to_le_16(bd3->nbytes),
1354                            rte_cpu_to_le_16(bd3->data.bitfields),
1355                            rte_cpu_to_le_16(bd3->data.lso_mss));
1356
1357         rte_get_tx_ol_flag_list(tx_ol_flags, ol_buf, sizeof(ol_buf));
1358         PMD_TX_LOG(INFO, txq, "TX offloads = %s\n", ol_buf);
1359 }
1360 #endif
1361
1362 /* TX prepare to check packets meets TX conditions */
1363 uint16_t
1364 qede_xmit_prep_pkts(void *p_txq, struct rte_mbuf **tx_pkts,
1365                     uint16_t nb_pkts)
1366 {
1367         struct qede_tx_queue *txq = p_txq;
1368         uint64_t ol_flags;
1369         struct rte_mbuf *m;
1370         uint16_t i;
1371         int ret;
1372
1373         for (i = 0; i < nb_pkts; i++) {
1374                 m = tx_pkts[i];
1375                 ol_flags = m->ol_flags;
1376                 if (ol_flags & PKT_TX_TCP_SEG) {
1377                         if (m->nb_segs >= ETH_TX_MAX_BDS_PER_LSO_PACKET) {
1378                                 rte_errno = -EINVAL;
1379                                 break;
1380                         }
1381                         /* TBD: confirm its ~9700B for both ? */
1382                         if (m->tso_segsz > ETH_TX_MAX_NON_LSO_PKT_LEN) {
1383                                 rte_errno = -EINVAL;
1384                                 break;
1385                         }
1386                 } else {
1387                         if (m->nb_segs >= ETH_TX_MAX_BDS_PER_NON_LSO_PACKET) {
1388                                 rte_errno = -EINVAL;
1389                                 break;
1390                         }
1391                 }
1392                 if (ol_flags & QEDE_TX_OFFLOAD_NOTSUP_MASK) {
1393                         rte_errno = -ENOTSUP;
1394                         break;
1395                 }
1396
1397 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
1398                 ret = rte_validate_tx_offload(m);
1399                 if (ret != 0) {
1400                         rte_errno = ret;
1401                         break;
1402                 }
1403 #endif
1404                 /* TBD: pseudo csum calcuation required iff
1405                  * ETH_TX_DATA_2ND_BD_L4_PSEUDO_CSUM_MODE not set?
1406                  */
1407                 ret = rte_net_intel_cksum_prepare(m);
1408                 if (ret != 0) {
1409                         rte_errno = ret;
1410                         break;
1411                 }
1412         }
1413
1414         if (unlikely(i != nb_pkts))
1415                 PMD_TX_LOG(ERR, txq, "TX prepare failed for %u\n",
1416                            nb_pkts - i);
1417         return i;
1418 }
1419
1420 uint16_t
1421 qede_xmit_pkts(void *p_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
1422 {
1423         struct qede_tx_queue *txq = p_txq;
1424         struct qede_dev *qdev = txq->qdev;
1425         struct ecore_dev *edev = &qdev->edev;
1426         struct rte_mbuf *mbuf;
1427         struct rte_mbuf *m_seg = NULL;
1428         uint16_t nb_tx_pkts;
1429         uint16_t bd_prod;
1430         uint16_t idx;
1431         uint16_t nb_frags;
1432         uint16_t nb_pkt_sent = 0;
1433         uint8_t nbds;
1434         bool ipv6_ext_flg;
1435         bool lso_flg;
1436         bool tunn_flg;
1437         struct eth_tx_1st_bd *bd1;
1438         struct eth_tx_2nd_bd *bd2;
1439         struct eth_tx_3rd_bd *bd3;
1440         uint64_t tx_ol_flags;
1441         uint16_t hdr_size;
1442
1443         if (unlikely(txq->nb_tx_avail < txq->tx_free_thresh)) {
1444                 PMD_TX_LOG(DEBUG, txq, "send=%u avail=%u free_thresh=%u",
1445                            nb_pkts, txq->nb_tx_avail, txq->tx_free_thresh);
1446                 qede_process_tx_compl(edev, txq);
1447         }
1448
1449         nb_tx_pkts  = nb_pkts;
1450         bd_prod = rte_cpu_to_le_16(ecore_chain_get_prod_idx(&txq->tx_pbl));
1451         while (nb_tx_pkts--) {
1452                 /* Init flags/values */
1453                 ipv6_ext_flg = false;
1454                 tunn_flg = false;
1455                 lso_flg = false;
1456                 nbds = 0;
1457                 bd1 = NULL;
1458                 bd2 = NULL;
1459                 bd3 = NULL;
1460                 hdr_size = 0;
1461
1462                 mbuf = *tx_pkts++;
1463                 assert(mbuf);
1464
1465                 /* Check minimum TX BDS availability against available BDs */
1466                 if (unlikely(txq->nb_tx_avail < mbuf->nb_segs))
1467                         break;
1468
1469                 tx_ol_flags = mbuf->ol_flags;
1470
1471 #define RTE_ETH_IS_IPV6_HDR_EXT(ptype) ((ptype) & RTE_PTYPE_L3_IPV6_EXT)
1472                 if (RTE_ETH_IS_IPV6_HDR_EXT(mbuf->packet_type))
1473                         ipv6_ext_flg = true;
1474
1475                 if (RTE_ETH_IS_TUNNEL_PKT(mbuf->packet_type))
1476                         tunn_flg = true;
1477
1478                 if (tx_ol_flags & PKT_TX_TCP_SEG)
1479                         lso_flg = true;
1480
1481                 if (lso_flg) {
1482                         if (unlikely(txq->nb_tx_avail <
1483                                                 ETH_TX_MIN_BDS_PER_LSO_PKT))
1484                                 break;
1485                 } else {
1486                         if (unlikely(txq->nb_tx_avail <
1487                                         ETH_TX_MIN_BDS_PER_NON_LSO_PKT))
1488                                 break;
1489                 }
1490
1491                 if (tunn_flg && ipv6_ext_flg) {
1492                         if (unlikely(txq->nb_tx_avail <
1493                                 ETH_TX_MIN_BDS_PER_TUNN_IPV6_WITH_EXT_PKT))
1494                                 break;
1495                 }
1496                 if (ipv6_ext_flg) {
1497                         if (unlikely(txq->nb_tx_avail <
1498                                         ETH_TX_MIN_BDS_PER_IPV6_WITH_EXT_PKT))
1499                                 break;
1500                 }
1501
1502                 /* Fill the entry in the SW ring and the BDs in the FW ring */
1503                 idx = TX_PROD(txq);
1504                 txq->sw_tx_ring[idx].mbuf = mbuf;
1505
1506                 /* BD1 */
1507                 bd1 = (struct eth_tx_1st_bd *)ecore_chain_produce(&txq->tx_pbl);
1508                 memset(bd1, 0, sizeof(struct eth_tx_1st_bd));
1509                 nbds++;
1510
1511                 bd1->data.bd_flags.bitfields |=
1512                         1 << ETH_TX_1ST_BD_FLAGS_START_BD_SHIFT;
1513                 /* FW 8.10.x specific change */
1514                 if (!lso_flg) {
1515                         bd1->data.bitfields |=
1516                         (mbuf->pkt_len & ETH_TX_DATA_1ST_BD_PKT_LEN_MASK)
1517                                 << ETH_TX_DATA_1ST_BD_PKT_LEN_SHIFT;
1518                         /* Map MBUF linear data for DMA and set in the BD1 */
1519                         QEDE_BD_SET_ADDR_LEN(bd1, rte_mbuf_data_dma_addr(mbuf),
1520                                              mbuf->data_len);
1521                 } else {
1522                         /* For LSO, packet header and payload must reside on
1523                          * buffers pointed by different BDs. Using BD1 for HDR
1524                          * and BD2 onwards for data.
1525                          */
1526                         hdr_size = mbuf->l2_len + mbuf->l3_len + mbuf->l4_len;
1527                         QEDE_BD_SET_ADDR_LEN(bd1, rte_mbuf_data_dma_addr(mbuf),
1528                                              hdr_size);
1529                 }
1530
1531                 if (tunn_flg) {
1532                         /* First indicate its a tunnel pkt */
1533                         bd1->data.bd_flags.bitfields |=
1534                                 ETH_TX_DATA_1ST_BD_TUNN_FLAG_MASK <<
1535                                 ETH_TX_DATA_1ST_BD_TUNN_FLAG_SHIFT;
1536
1537                         /* Legacy FW had flipped behavior in regard to this bit
1538                          * i.e. it needed to set to prevent FW from touching
1539                          * encapsulated packets when it didn't need to.
1540                          */
1541                         if (unlikely(txq->is_legacy))
1542                                 bd1->data.bitfields ^=
1543                                         1 << ETH_TX_DATA_1ST_BD_TUNN_FLAG_SHIFT;
1544
1545                         /* Outer IP checksum offload */
1546                         if (tx_ol_flags & PKT_TX_OUTER_IP_CKSUM) {
1547                                 bd1->data.bd_flags.bitfields |=
1548                                         ETH_TX_1ST_BD_FLAGS_TUNN_IP_CSUM_MASK <<
1549                                         ETH_TX_1ST_BD_FLAGS_TUNN_IP_CSUM_SHIFT;
1550                         }
1551
1552                         /* Outer UDP checksum offload */
1553                         bd1->data.bd_flags.bitfields |=
1554                                 ETH_TX_1ST_BD_FLAGS_TUNN_L4_CSUM_MASK <<
1555                                 ETH_TX_1ST_BD_FLAGS_TUNN_L4_CSUM_SHIFT;
1556                 }
1557
1558                 /* Descriptor based VLAN insertion */
1559                 if (tx_ol_flags & (PKT_TX_VLAN_PKT | PKT_TX_QINQ_PKT)) {
1560                         bd1->data.vlan = rte_cpu_to_le_16(mbuf->vlan_tci);
1561                         bd1->data.bd_flags.bitfields |=
1562                             1 << ETH_TX_1ST_BD_FLAGS_VLAN_INSERTION_SHIFT;
1563                 }
1564
1565                 if (lso_flg)
1566                         bd1->data.bd_flags.bitfields |=
1567                                 1 << ETH_TX_1ST_BD_FLAGS_LSO_SHIFT;
1568
1569                 /* Offload the IP checksum in the hardware */
1570                 if ((lso_flg) || (tx_ol_flags & PKT_TX_IP_CKSUM))
1571                         bd1->data.bd_flags.bitfields |=
1572                             1 << ETH_TX_1ST_BD_FLAGS_IP_CSUM_SHIFT;
1573
1574                 /* L4 checksum offload (tcp or udp) */
1575                 if ((lso_flg) || (tx_ol_flags & (PKT_TX_TCP_CKSUM |
1576                                                 PKT_TX_UDP_CKSUM)))
1577                         /* PKT_TX_TCP_SEG implies PKT_TX_TCP_CKSUM */
1578                         bd1->data.bd_flags.bitfields |=
1579                             1 << ETH_TX_1ST_BD_FLAGS_L4_CSUM_SHIFT;
1580
1581                 /* BD2 */
1582                 if (lso_flg || ipv6_ext_flg) {
1583                         bd2 = (struct eth_tx_2nd_bd *)ecore_chain_produce
1584                                                         (&txq->tx_pbl);
1585                         memset(bd2, 0, sizeof(struct eth_tx_2nd_bd));
1586                         nbds++;
1587                         QEDE_BD_SET_ADDR_LEN(bd2,
1588                                             (hdr_size +
1589                                             rte_mbuf_data_dma_addr(mbuf)),
1590                                             mbuf->data_len - hdr_size);
1591                         /* TBD: check pseudo csum iff tx_prepare not called? */
1592                         if (ipv6_ext_flg) {
1593                                 bd2->data.bitfields1 |=
1594                                 ETH_L4_PSEUDO_CSUM_ZERO_LENGTH <<
1595                                 ETH_TX_DATA_2ND_BD_L4_PSEUDO_CSUM_MODE_SHIFT;
1596                         }
1597                 }
1598
1599                 /* BD3 */
1600                 if (lso_flg || ipv6_ext_flg) {
1601                         bd3 = (struct eth_tx_3rd_bd *)ecore_chain_produce
1602                                                         (&txq->tx_pbl);
1603                         memset(bd3, 0, sizeof(struct eth_tx_3rd_bd));
1604                         nbds++;
1605                         if (lso_flg) {
1606                                 bd3->data.lso_mss =
1607                                         rte_cpu_to_le_16(mbuf->tso_segsz);
1608                                 /* Using one header BD */
1609                                 bd3->data.bitfields |=
1610                                         rte_cpu_to_le_16(1 <<
1611                                         ETH_TX_DATA_3RD_BD_HDR_NBD_SHIFT);
1612                         }
1613                 }
1614
1615                 /* Handle fragmented MBUF */
1616                 m_seg = mbuf->next;
1617                 /* Encode scatter gather buffer descriptors if required */
1618                 nb_frags = qede_encode_sg_bd(txq, m_seg, &bd2, &bd3);
1619                 bd1->data.nbds = nbds + nb_frags;
1620                 txq->nb_tx_avail -= bd1->data.nbds;
1621                 txq->sw_tx_prod++;
1622                 rte_prefetch0(txq->sw_tx_ring[TX_PROD(txq)].mbuf);
1623                 bd_prod =
1624                     rte_cpu_to_le_16(ecore_chain_get_prod_idx(&txq->tx_pbl));
1625 #ifdef RTE_LIBRTE_QEDE_DEBUG_TX
1626                 print_tx_bd_info(txq, bd1, bd2, bd3, tx_ol_flags);
1627                 PMD_TX_LOG(INFO, txq, "lso=%d tunn=%d ipv6_ext=%d\n",
1628                            lso_flg, tunn_flg, ipv6_ext_flg);
1629 #endif
1630                 nb_pkt_sent++;
1631                 txq->xmit_pkts++;
1632         }
1633
1634         /* Write value of prod idx into bd_prod */
1635         txq->tx_db.data.bd_prod = bd_prod;
1636         rte_wmb();
1637         rte_compiler_barrier();
1638         DIRECT_REG_WR_RELAXED(edev, txq->doorbell_addr, txq->tx_db.raw);
1639         rte_wmb();
1640
1641         /* Check again for Tx completions */
1642         qede_process_tx_compl(edev, txq);
1643
1644         PMD_TX_LOG(DEBUG, txq, "to_send=%u sent=%u bd_prod=%u core=%d",
1645                    nb_pkts, nb_pkt_sent, TX_PROD(txq), rte_lcore_id());
1646
1647         return nb_pkt_sent;
1648 }
1649
1650 static void qede_init_fp_queue(struct rte_eth_dev *eth_dev)
1651 {
1652         struct qede_dev *qdev = eth_dev->data->dev_private;
1653         struct qede_fastpath *fp;
1654         uint8_t i, rss_id, txq_index, tc;
1655         int rxq = 0, txq = 0;
1656
1657         for_each_queue(i) {
1658                 fp = &qdev->fp_array[i];
1659                 if (fp->type & QEDE_FASTPATH_RX) {
1660                         fp->rxq = eth_dev->data->rx_queues[i];
1661                         fp->rxq->queue_id = rxq++;
1662                 }
1663
1664                 if (fp->type & QEDE_FASTPATH_TX) {
1665                         for (tc = 0; tc < qdev->num_tc; tc++) {
1666                                 txq_index = tc * QEDE_TSS_COUNT(qdev) + txq;
1667                                 fp->txqs[tc] =
1668                                         eth_dev->data->tx_queues[txq_index];
1669                                 fp->txqs[tc]->queue_id = txq_index;
1670                                 if (qdev->dev_info.is_legacy)
1671                                         fp->txqs[tc]->is_legacy = true;
1672                         }
1673                         txq++;
1674                 }
1675         }
1676 }
1677
1678 int qede_dev_start(struct rte_eth_dev *eth_dev)
1679 {
1680         struct qede_dev *qdev = eth_dev->data->dev_private;
1681         struct ecore_dev *edev = &qdev->edev;
1682         struct qed_link_output link_output;
1683         struct qede_fastpath *fp;
1684         int rc;
1685
1686         DP_INFO(edev, "Device state is %d\n", qdev->state);
1687
1688         if (qdev->state == QEDE_DEV_START) {
1689                 DP_INFO(edev, "Port is already started\n");
1690                 return 0;
1691         }
1692
1693         if (qdev->state == QEDE_DEV_CONFIG)
1694                 qede_init_fp_queue(eth_dev);
1695
1696         rc = qede_start_queues(eth_dev, true);
1697         if (rc) {
1698                 DP_ERR(edev, "Failed to start queues\n");
1699                 /* TBD: free */
1700                 return rc;
1701         }
1702
1703         /* Newer SR-IOV PF driver expects RX/TX queues to be started before
1704          * enabling RSS. Hence RSS configuration is deferred upto this point.
1705          * Also, we would like to retain similar behavior in PF case, so we
1706          * don't do PF/VF specific check here.
1707          */
1708         if (eth_dev->data->dev_conf.rxmode.mq_mode  == ETH_MQ_RX_RSS)
1709                 if (qede_config_rss(eth_dev))
1710                         return -1;
1711
1712         /* Bring-up the link */
1713         qede_dev_set_link_state(eth_dev, true);
1714
1715         /* Start/resume traffic */
1716         qdev->ops->fastpath_start(edev);
1717
1718         qdev->state = QEDE_DEV_START;
1719
1720         DP_INFO(edev, "dev_state is QEDE_DEV_START\n");
1721
1722         return 0;
1723 }
1724
1725 static int qede_drain_txq(struct qede_dev *qdev,
1726                           struct qede_tx_queue *txq, bool allow_drain)
1727 {
1728         struct ecore_dev *edev = &qdev->edev;
1729         int rc, cnt = 1000;
1730
1731         while (txq->sw_tx_cons != txq->sw_tx_prod) {
1732                 qede_process_tx_compl(edev, txq);
1733                 if (!cnt) {
1734                         if (allow_drain) {
1735                                 DP_ERR(edev, "Tx queue[%u] is stuck,"
1736                                           "requesting MCP to drain\n",
1737                                           txq->queue_id);
1738                                 rc = qdev->ops->common->drain(edev);
1739                                 if (rc)
1740                                         return rc;
1741                                 return qede_drain_txq(qdev, txq, false);
1742                         }
1743                         DP_ERR(edev, "Timeout waiting for tx queue[%d]:"
1744                                   "PROD=%d, CONS=%d\n",
1745                                   txq->queue_id, txq->sw_tx_prod,
1746                                   txq->sw_tx_cons);
1747                         return -1;
1748                 }
1749                 cnt--;
1750                 DELAY(1000);
1751                 rte_compiler_barrier();
1752         }
1753
1754         /* FW finished processing, wait for HW to transmit all tx packets */
1755         DELAY(2000);
1756
1757         return 0;
1758 }
1759
1760 static int qede_stop_queues(struct qede_dev *qdev)
1761 {
1762         struct qed_update_vport_params vport_update_params;
1763         struct ecore_dev *edev = &qdev->edev;
1764         struct ecore_sge_tpa_params tpa_params;
1765         struct qede_fastpath *fp;
1766         int rc, tc, i;
1767
1768         /* Disable the vport */
1769         memset(&vport_update_params, 0, sizeof(vport_update_params));
1770         vport_update_params.vport_id = 0;
1771         vport_update_params.update_vport_active_flg = 1;
1772         vport_update_params.vport_active_flg = 0;
1773         vport_update_params.update_rss_flg = 0;
1774         /* Disable TPA */
1775         if (qdev->enable_lro) {
1776                 DP_INFO(edev, "Disabling LRO\n");
1777                 memset(&tpa_params, 0, sizeof(struct ecore_sge_tpa_params));
1778                 qede_update_sge_tpa_params(&tpa_params, qdev->mtu, false);
1779                 vport_update_params.sge_tpa_params = &tpa_params;
1780         }
1781
1782         DP_INFO(edev, "Deactivate vport\n");
1783         rc = qdev->ops->vport_update(edev, &vport_update_params);
1784         if (rc) {
1785                 DP_ERR(edev, "Failed to update vport\n");
1786                 return rc;
1787         }
1788
1789         DP_INFO(edev, "Flushing tx queues\n");
1790
1791         /* Flush Tx queues. If needed, request drain from MCP */
1792         for_each_queue(i) {
1793                 fp = &qdev->fp_array[i];
1794
1795                 if (fp->type & QEDE_FASTPATH_TX) {
1796                         for (tc = 0; tc < qdev->num_tc; tc++) {
1797                                 struct qede_tx_queue *txq = fp->txqs[tc];
1798
1799                                 rc = qede_drain_txq(qdev, txq, true);
1800                                 if (rc)
1801                                         return rc;
1802                         }
1803                 }
1804         }
1805
1806         /* Stop all Queues in reverse order */
1807         for (i = QEDE_QUEUE_CNT(qdev) - 1; i >= 0; i--) {
1808                 fp = &qdev->fp_array[i];
1809
1810                 /* Stop the Tx Queue(s) */
1811                 if (qdev->fp_array[i].type & QEDE_FASTPATH_TX) {
1812                         for (tc = 0; tc < qdev->num_tc; tc++) {
1813                                 struct qede_tx_queue *txq = fp->txqs[tc];
1814                                 DP_INFO(edev, "Stopping tx queues\n");
1815                                 rc = qdev->ops->q_tx_stop(edev, i, txq->handle);
1816                                 if (rc) {
1817                                         DP_ERR(edev, "Failed to stop TXQ #%d\n",
1818                                                i);
1819                                         return rc;
1820                                 }
1821                         }
1822                 }
1823
1824                 /* Stop the Rx Queue */
1825                 if (qdev->fp_array[i].type & QEDE_FASTPATH_RX) {
1826                         DP_INFO(edev, "Stopping rx queues\n");
1827                         rc = qdev->ops->q_rx_stop(edev, i, fp->rxq->handle);
1828                         if (rc) {
1829                                 DP_ERR(edev, "Failed to stop RXQ #%d\n", i);
1830                                 return rc;
1831                         }
1832                 }
1833         }
1834         qede_reset_fp_rings(qdev);
1835
1836         return 0;
1837 }
1838
1839 int qede_reset_fp_rings(struct qede_dev *qdev)
1840 {
1841         struct qede_fastpath *fp;
1842         struct qede_tx_queue *txq;
1843         uint8_t tc;
1844         uint16_t id, i;
1845
1846         for_each_queue(id) {
1847                 fp = &qdev->fp_array[id];
1848
1849                 if (fp->type & QEDE_FASTPATH_RX) {
1850                         DP_INFO(&qdev->edev,
1851                                 "Reset FP chain for RSS %u\n", id);
1852                         qede_rx_queue_release_mbufs(fp->rxq);
1853                         ecore_chain_reset(&fp->rxq->rx_bd_ring);
1854                         ecore_chain_reset(&fp->rxq->rx_comp_ring);
1855                         fp->rxq->sw_rx_prod = 0;
1856                         fp->rxq->sw_rx_cons = 0;
1857                         *fp->rxq->hw_cons_ptr = 0;
1858                         for (i = 0; i < fp->rxq->nb_rx_desc; i++) {
1859                                 if (qede_alloc_rx_buffer(fp->rxq)) {
1860                                         DP_ERR(&qdev->edev,
1861                                                "RX buffer allocation failed\n");
1862                                         return -ENOMEM;
1863                                 }
1864                         }
1865                 }
1866                 if (fp->type & QEDE_FASTPATH_TX) {
1867                         for (tc = 0; tc < qdev->num_tc; tc++) {
1868                                 txq = fp->txqs[tc];
1869                                 qede_tx_queue_release_mbufs(txq);
1870                                 ecore_chain_reset(&txq->tx_pbl);
1871                                 txq->sw_tx_cons = 0;
1872                                 txq->sw_tx_prod = 0;
1873                                 *txq->hw_cons_ptr = 0;
1874                         }
1875                 }
1876         }
1877
1878         return 0;
1879 }
1880
1881 /* This function frees all memory of a single fp */
1882 void qede_free_mem_load(struct rte_eth_dev *eth_dev)
1883 {
1884         struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
1885         struct qede_fastpath *fp;
1886         uint16_t txq_idx;
1887         uint8_t id;
1888         uint8_t tc;
1889
1890         for_each_queue(id) {
1891                 fp = &qdev->fp_array[id];
1892                 if (fp->type & QEDE_FASTPATH_RX) {
1893                         if (!fp->rxq)
1894                                 continue;
1895                         qede_rx_queue_release(fp->rxq);
1896                         eth_dev->data->rx_queues[id] = NULL;
1897                 } else {
1898                         for (tc = 0; tc < qdev->num_tc; tc++) {
1899                                 if (!fp->txqs[tc])
1900                                         continue;
1901                                 txq_idx = fp->txqs[tc]->queue_id;
1902                                 qede_tx_queue_release(fp->txqs[tc]);
1903                                 eth_dev->data->tx_queues[txq_idx] = NULL;
1904                         }
1905                 }
1906         }
1907 }
1908
1909 void qede_dev_stop(struct rte_eth_dev *eth_dev)
1910 {
1911         struct qede_dev *qdev = eth_dev->data->dev_private;
1912         struct ecore_dev *edev = &qdev->edev;
1913
1914         DP_INFO(edev, "port %u\n", eth_dev->data->port_id);
1915
1916         if (qdev->state != QEDE_DEV_START) {
1917                 DP_INFO(edev, "Device not yet started\n");
1918                 return;
1919         }
1920
1921         if (qede_stop_queues(qdev))
1922                 DP_ERR(edev, "Didn't succeed to close queues\n");
1923
1924         DP_INFO(edev, "Stopped queues\n");
1925
1926         qdev->ops->fastpath_stop(edev);
1927
1928         /* Bring the link down */
1929         qede_dev_set_link_state(eth_dev, false);
1930
1931         qdev->state = QEDE_DEV_STOP;
1932
1933         DP_INFO(edev, "dev_state is QEDE_DEV_STOP\n");
1934 }
1935
1936 uint16_t
1937 qede_rxtx_pkts_dummy(__rte_unused void *p_rxq,
1938                      __rte_unused struct rte_mbuf **pkts,
1939                      __rte_unused uint16_t nb_pkts)
1940 {
1941         return 0;
1942 }