crypto/aesni_gcm: support in-place chained mbufs
[dpdk.git] / drivers / net / bnxt / bnxt_rxq.c
index 4b506f8..d55adc3 100644 (file)
@@ -8,7 +8,6 @@
 #include <rte_malloc.h>
 
 #include "bnxt.h"
-#include "bnxt_cpr.h"
 #include "bnxt_filter.h"
 #include "bnxt_hwrm.h"
 #include "bnxt_ring.h"
@@ -64,6 +63,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
                        rc = -ENOMEM;
                        goto err_out;
                }
+               filter->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST;
                STAILQ_INSERT_TAIL(&vnic->filter, filter, next);
                goto out;
        }
@@ -75,6 +75,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
                switch (dev_conf->rxmode.mq_mode) {
                case ETH_MQ_RX_VMDQ_RSS:
                case ETH_MQ_RX_VMDQ_ONLY:
+               case ETH_MQ_RX_VMDQ_DCB_RSS:
                        /* FALLTHROUGH */
                        /* ETH_8/64_POOLs */
                        pools = conf->nb_queue_pools;
@@ -90,7 +91,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
                                pools = max_pools;
                        break;
                case ETH_MQ_RX_RSS:
-                       pools = 1;
+                       pools = bp->rx_cosq_cnt ? bp->rx_cosq_cnt : 1;
                        break;
                default:
                        PMD_DRV_LOG(ERR, "Unsupported mq_mod %d\n",
@@ -100,6 +101,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
                }
        }
        nb_q_per_grp = bp->rx_cp_nr_rings / pools;
+       bp->rx_num_qs_per_vnic = nb_q_per_grp;
        PMD_DRV_LOG(DEBUG, "pools = %u nb_q_per_grp = %u\n",
                    pools, nb_q_per_grp);
        start_grp_id = 0;
@@ -144,6 +146,7 @@ int bnxt_mq_rx_configure(struct bnxt *bp)
                        rc = -ENOMEM;
                        goto err_out;
                }
+               filter->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_OUTERMOST;
                /*
                 * TODO: Configure & associate CFA rule for
                 * each VNIC for each VMDq with MACVLAN, MACVLAN+TC
@@ -158,29 +161,16 @@ skip_filter_allocation:
 out:
        if (dev_conf->rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) {
                struct rte_eth_rss_conf *rss = &dev_conf->rx_adv_conf.rss_conf;
-               uint16_t hash_type = 0;
 
                if (bp->flags & BNXT_FLAG_UPDATE_HASH) {
                        rss = &bp->rss_conf;
                        bp->flags &= ~BNXT_FLAG_UPDATE_HASH;
                }
 
-               if (rss->rss_hf & ETH_RSS_IPV4)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV4;
-               if (rss->rss_hf & ETH_RSS_NONFRAG_IPV4_TCP)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV4;
-               if (rss->rss_hf & ETH_RSS_NONFRAG_IPV4_UDP)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV4;
-               if (rss->rss_hf & ETH_RSS_IPV6)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_IPV6;
-               if (rss->rss_hf & ETH_RSS_NONFRAG_IPV6_TCP)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_TCP_IPV6;
-               if (rss->rss_hf & ETH_RSS_NONFRAG_IPV6_UDP)
-                       hash_type |= HWRM_VNIC_RSS_CFG_INPUT_HASH_TYPE_UDP_IPV6;
-
                for (i = 0; i < bp->nr_vnics; i++) {
                        vnic = &bp->vnic_info[i];
-                       vnic->hash_type = hash_type;
+                       vnic->hash_type =
+                               bnxt_rte_to_hwrm_hash_types(rss->rss_hf);
 
                        /*
                         * Use the supplied key if the key length is
@@ -207,39 +197,42 @@ void bnxt_rx_queue_release_mbufs(struct bnxt_rx_queue *rxq)
        struct bnxt_tpa_info *tpa_info;
        uint16_t i;
 
+       if (!rxq)
+               return;
+
        rte_spinlock_lock(&rxq->lock);
 
-       if (rxq) {
-               sw_ring = rxq->rx_ring->rx_buf_ring;
-               if (sw_ring) {
-                       for (i = 0;
-                            i < rxq->rx_ring->rx_ring_struct->ring_size; i++) {
-                               if (sw_ring[i].mbuf) {
-                                       rte_pktmbuf_free_seg(sw_ring[i].mbuf);
-                                       sw_ring[i].mbuf = NULL;
-                               }
+       sw_ring = rxq->rx_ring->rx_buf_ring;
+       if (sw_ring) {
+               for (i = 0;
+                    i < rxq->rx_ring->rx_ring_struct->ring_size; i++) {
+                       if (sw_ring[i].mbuf) {
+                               rte_pktmbuf_free_seg(sw_ring[i].mbuf);
+                               sw_ring[i].mbuf = NULL;
                        }
                }
-               /* Free up mbufs in Agg ring */
-               sw_ring = rxq->rx_ring->ag_buf_ring;
-               if (sw_ring) {
-                       for (i = 0;
-                            i < rxq->rx_ring->ag_ring_struct->ring_size; i++) {
-                               if (sw_ring[i].mbuf) {
-                                       rte_pktmbuf_free_seg(sw_ring[i].mbuf);
-                                       sw_ring[i].mbuf = NULL;
-                               }
+       }
+       /* Free up mbufs in Agg ring */
+       sw_ring = rxq->rx_ring->ag_buf_ring;
+       if (sw_ring) {
+               for (i = 0;
+                    i < rxq->rx_ring->ag_ring_struct->ring_size; i++) {
+                       if (sw_ring[i].mbuf) {
+                               rte_pktmbuf_free_seg(sw_ring[i].mbuf);
+                               sw_ring[i].mbuf = NULL;
                        }
                }
+       }
+
+       /* Free up mbufs in TPA */
+       tpa_info = rxq->rx_ring->tpa_info;
+       if (tpa_info) {
+               int max_aggs = BNXT_TPA_MAX_AGGS(rxq->bp);
 
-               /* Free up mbufs in TPA */
-               tpa_info = rxq->rx_ring->tpa_info;
-               if (tpa_info) {
-                       for (i = 0; i < BNXT_TPA_MAX; i++) {
-                               if (tpa_info[i].mbuf) {
-                                       rte_pktmbuf_free_seg(tpa_info[i].mbuf);
-                                       tpa_info[i].mbuf = NULL;
-                               }
+               for (i = 0; i < max_aggs; i++) {
+                       if (tpa_info[i].mbuf) {
+                               rte_pktmbuf_free_seg(tpa_info[i].mbuf);
+                               tpa_info[i].mbuf = NULL;
                        }
                }
        }
@@ -347,8 +340,8 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
 
        eth_dev->data->rx_queues[queue_idx] = rxq;
        /* Allocate RX ring hardware descriptors */
-       if (bnxt_alloc_rings(bp, queue_idx, NULL, rxq, rxq->cp_ring,
-                       rxq->nq_ring, "rxr")) {
+       if (bnxt_alloc_rings(bp, queue_idx, NULL, rxq, rxq->cp_ring, NULL,
+                            "rxr")) {
                PMD_DRV_LOG(ERR,
                        "ring_dma_zone_reserve for rx_ring failed!\n");
                bnxt_rx_queue_release_op(rxq);
@@ -373,6 +366,10 @@ int bnxt_rx_queue_setup_op(struct rte_eth_dev *eth_dev,
        eth_dev->data->rx_queue_state[queue_idx] = queue_state;
        rte_spinlock_init(&rxq->lock);
 
+       /* Configure mtu if it is different from what was configured before */
+       if (!queue_idx)
+               bnxt_mtu_set_op(eth_dev, eth_dev->data->mtu);
+
 out:
        return rc;
 }
@@ -391,10 +388,9 @@ bnxt_rx_queue_intr_enable_op(struct rte_eth_dev *eth_dev, uint16_t queue_id)
 
        if (eth_dev->data->rx_queues) {
                rxq = eth_dev->data->rx_queues[queue_id];
-               if (!rxq) {
-                       rc = -EINVAL;
-                       return rc;
-               }
+               if (!rxq)
+                       return -EINVAL;
+
                cpr = rxq->cp_ring;
                B_CP_DB_REARM(cpr, cpr->cp_raw_cons);
        }
@@ -415,10 +411,9 @@ bnxt_rx_queue_intr_disable_op(struct rte_eth_dev *eth_dev, uint16_t queue_id)
 
        if (eth_dev->data->rx_queues) {
                rxq = eth_dev->data->rx_queues[queue_id];
-               if (!rxq) {
-                       rc = -EINVAL;
-                       return rc;
-               }
+               if (!rxq)
+                       return -EINVAL;
+
                cpr = rxq->cp_ring;
                B_CP_DB_DISARM(cpr);
        }
@@ -468,7 +463,9 @@ int bnxt_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
                                    vnic, bp->grp_info[rx_queue_id].fw_grp_id);
                }
 
-               rc = bnxt_vnic_rss_configure(bp, vnic);
+               PMD_DRV_LOG(DEBUG, "Rx Queue Count %d\n", vnic->rx_queue_cnt);
+               if (vnic->rx_queue_cnt > 1)
+                       rc = bnxt_vnic_rss_configure(bp, vnic);
        }
 
        if (rc == 0)
@@ -521,7 +518,10 @@ int bnxt_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
                vnic = rxq->vnic;
                if (BNXT_HAS_RING_GRPS(bp))
                        vnic->fw_grp_ids[rx_queue_id] = INVALID_HW_RING_ID;
-               rc = bnxt_vnic_rss_configure(bp, vnic);
+
+               PMD_DRV_LOG(DEBUG, "Rx Queue Count %d\n", vnic->rx_queue_cnt);
+               if (vnic->rx_queue_cnt > 1)
+                       rc = bnxt_vnic_rss_configure(bp, vnic);
        }
 
        if (rc == 0)